javac命令詳解

JAVAC 命令詳解

 

結構

javac [ options ] [ sourcefiles ] [ @files ]

參數可按任意次序排列。

options

命令行選項。

sourcefiles

一個或多個要編譯的源文件(例如 MyClass.java)。

@files

一個或多個對源文件進行列表的文件。

說明

javac

有兩種方法可將源代碼文件名傳遞給 javac

·        如果源文件數量少,在命令行上列出文件名即可。

·        如果源文件數量多,則將源文件名列在一個文件中,名稱間用空格或回車行來進行分隔。然後在 javac 命令行中使用該列表文件名,文件名前冠以 @ 字符。

源代碼文件名稱必須含有.java後綴,類文件名稱必須含有.class後綴,源文件和類文件都必須有識別該類的根名。例如,名爲MyClass的類將寫在名爲MyClass.java的源文件中,並被編譯爲字節碼類文件MyClass.class

內部類定義產生附加的類文件。這些類文件的名稱將內部類和外部類的名稱結合在一起,例如MyClass$MyInnerClass.class

應當將源文件安排在反映其包樹結構的目錄樹中。例如,如果將所有的源文件放在 /workspace 中,那麼com.mysoft.mypack.MyClass的代碼應該在 \workspace\com\mysoft\mypack\MyClass.java 中。

缺省情況下,編譯器將每個類文件與其源文件放在同一目錄中。可用 -d 選項(請參閱後面的選項)指定其它目標目錄。

工具讀取用 Java 編程語言編寫的類和接口定義,並將它們編譯成字節碼類文件。

查找類型

當編譯源文件時,編譯器常常需要它還沒有識別出的類型的有關信息。對於源文件中使用、擴展或實現的每個類或接口,編譯器都需要其類型信息。這包括在源文件中沒有明確提及、但通過繼承提供信息的類和接口。

例如,當擴展java.applet.Applet時還要用到Applet的祖先類:java.awt.Paneljava.awt.Containerjava.awt.Componentjava.awt.Object

當編譯器需要類型信息時,它將查找定義類型的源文件或類文件。編譯器先在自舉類及擴展類中查找,然後在用戶類路徑中查找。用戶類路徑通過兩種途徑來定義:通過設置CLASSPATH環境變量或使用-classpath命令行選項。(有關詳細資料,請參閱設置類路徑)。如果使用-sourcepath選項,則編譯器在 sourcepath指定的路徑中查找源文件;否則,編譯器將在用戶類路徑中查找類文件和源文件。可用-bootclasspath-extdirs選項來指定不同的自舉類或擴展類;參閱下面的聯編選項。

成功的類型搜索可能生成類文件、源文件或兩者兼有。以下是javac對各種情形所進行的處理:

·        搜索結果只生成類文件而沒有源文件: javac 使用類文件。

·        搜索結果只生成源文件而沒有類文件: javac 編譯源文件並使用由此生成的類文件。

·        搜索結果既生成源文件又生成類文件:確定類文件是否過時。若類文件已過時,則 javac 重新編譯源文件並使用更新後的類文件。否則, javac 直接使用類文件。

缺省情況下,只要類文件比源文件舊,javac就認爲它已過時。(-Xdepend選項指定相對來說較慢但卻比較可靠的過程。)

javac

注意:javac可以隱式編譯一些沒有在命令行中提及的源文件。用-verbose選項可跟蹤自動編譯。

文件列表

爲縮短或簡化javac命令,可以指定一個或多個每行含有一個文件名的文件。在命令行中,採用 '@' 字符加上文件名的方法將它指定爲文件列表。當 javac 遇到以 `@' 字符開頭的參數時,它對那個文件中所含文件名的操作跟對命令行中文件名的操作是一樣的。這使得 Windows 命令行長度不再受限制。

例如,可以在名爲sourcefiles的文件中列出所有源文件的名稱。該文件可能形如:

     MyClass1.java

MyClass2.java

MyClass3.java

然後可用下列命令運行編譯器:

     C:> javac@sourcefiles

選項

編譯器有一批標準選項,目前的開發環境支持這些標準選項,將來的版本也將支持它。還有一批附加的非標準選項是目前的虛擬機實現所特有的,將來可能要有變化。非標準選項以-X打頭。

標準選項

-classpath類路徑

設置用戶類路徑,它將覆蓋 CLASSPATH 環境變量中的用戶類路徑。若既未指定 CLASSPATH 又未指定 -classpath,則用戶類路徑由當前目錄構成。有關詳細信息,請參閱設置類路徑。

若未指定-sourcepath選項,則將在用戶類路徑中查找類文件和源文件。

-d目錄

設置類文件的目標目錄。如果某個類是一個包的組成部分,則 javac 將把該類文件放入反映包名的子目錄中,必要時創建目錄。例如,如果指定 -d c:\myclasses 並且該類名叫com.mypackage.MyClass,那麼類文件就叫作c:\myclasses\com\mypackage\MyClass.class

若未指定-d選項,則javac將把類文件放到與源文件相同的目錄中。

注意:-d選項指定的目錄不會被自動添加到用戶類路徑中。

-deprecation

顯示每種不鼓勵使用的成員或類的使用或覆蓋的說明。沒有給出 -deprecation 選項的話, javac 將顯示這類源文件的名稱:這些源文件使用或覆蓋不鼓勵使用的成員或類。

-encoding

設置源文件編碼名稱,例如EUCJIS/SJIS。若未指定 -encoding 選項,則使用平臺缺省的轉換器。

-g

生成所有的調試信息,包括局部變量。缺省情況下,只生成行號和源文件信息。

-g:none

不生成任何調試信息。

-g:{關鍵字列表}

只生成某些類型的調試信息,這些類型由逗號分隔的關鍵字列表所指定。有效的關鍵字有:

source

源文件調試信息

lines

行號調試信息

vars

局部變量調試信息

-nowarn

禁用警告信息。

-O

優化代碼以縮短執行時間。使用 -O 選項可能使編譯速度下降、生成更大的類文件並使程序難以調試。

JDK 1.2 以前的版本中,javac -g選項和-O選項不能一起使用。在 JDK 1.2 中,可以將-g-O選項結合起來,但可能會得到意想不到的結果,如丟失變量或重新定位代碼或丟失代碼。-O選項不再自動打開-depend或關閉-g選項。同樣,-O選項也不再允許進行跨類內嵌。

-sourcepath源路徑

指定用以查找類或接口定義的源代碼路徑。與用戶類路徑一樣,源路徑項用分號 (;) 進行分隔,它們可以是目錄、JAR 歸檔文件或 ZIP 歸檔文件。如果使用包,那麼目錄或歸檔文件中的本地路徑名必須反映包名。

注意:通過類路徑查找的類,如果找到了其源文件,則可能會自動被重新編譯。

-verbose

冗長輸出。它包括了每個所加載的類和每個所編譯的源文件的有關信息。

缺省情況下,類是根據與javac一起發行的 JDK 自舉類和擴展類來編譯。但javac也支持聯編,在聯編中,類是根據其它 Java平臺實現的自舉類和擴展類來進行編譯的。聯編時,-bootclasspath-extdirs的使用很重要;請參閱下面的聯編程序示例。

-target版本

生成將在指定版本的虛擬機上運行的類文件。缺省情況下生成與 1.1 1.2 版本的虛擬機都兼容的類文件。JDK 1.2 中的 javac 所支持的版本有:

1.1

保證所產生的類文件與 1.1 1.2 版的虛擬機兼容。這是缺省狀態。

1.2

生成的類文件可在 1.2 版的虛擬機上運行,但不能在 1.1 版的虛擬機上運行。

-bootclasspath自舉類路徑

根據指定的自舉類集進行聯編。和用戶類路徑一樣,自舉類路徑項用分號 (;) 進行分隔,它們可以是目錄、JAR 歸檔文件或 ZIP 歸檔文件。

-extdirs目錄

根據指定的擴展目錄進行聯編。目錄是以分號分隔的目錄列表。在指定目錄的每個 JAR 歸檔文件中查找類文件。

-X

顯示非標準選項的有關信息並退出。

-Xdepend

遞歸地搜索所有可獲得的類,以尋找要重編譯的最新源文件。該選項將更可靠地查找需要編譯的類,但會使編譯進程的速度大爲減慢。

-Xstdout

將編譯器信息送到System.out中。缺省情況下,編譯器信息送到System.err中。

-Xverbosepath

說明如何搜索路徑和標準擴展以查找源文件和類文件。

-J選項

選項傳給 javac 調用的 java 啓動器。例如, -J-Xms48m 將啓動內存設爲 48 兆字節。雖然它不以 -X 開頭,但它並不是 javac 標準選項。用 -J將選項傳給執行用 Java 編寫的應用程序的虛擬機是一種公共約定。

注意:CLASSPATH-classpath-bootclasspath-extdirs指定用於運行javac的類。如此濫用編譯器的實現通常沒有任何意義而且總是很危險的。如果確實需要這樣做,可用-J選項將選項傳給基本的java啓動器。

程序示例

一個源文件Hello.java,它定義了一個名叫greetings.Hello的類。greetings目錄是源文件和類文件兩者的包目錄,且它不是當前目錄。這讓我們可以使用缺省的用戶類路徑。它也使我們沒必要用-d選項指定單獨的目標目錄。

C:> dir

greetings/

C:> dir greetings

Hello.java

C:> cat greetings\Hello.java

package greetings;

public class Hello {

public static void main(String[] args) {

for (int i=0; i < args.length; i++) {

System.out.println("Hello " + args[i]);

}

}

}

C:> javac greetings\Hello.java

C:> dir greetings

Hello.class  Hello.java

C:> java greetings.Hello World Universe Everyone

Hello World

Hello Universe

Hello Everyone

該示例編譯greetings包中的所有源文件。

C:> dir

greetings\

C:> dir greetings

Aloha.java         GutenTag.java      Hello.java         Hi.java

C:> javac greetings\*.java

C:> dir greetings

Aloha.class        GutenTag.class     Hello.class         Hi.class

Aloha.java         GutenTag.java      Hello.java          Hi.java

對前面示例中的某個源文件進行更改後,重新編譯它:

C:> cd

\examples

C:> javac greetings\Hi.java

由於greetings.Hi引用了greetings包中其它的類,編譯器需要找到這些其它的類。上面的示例能運行是因爲缺省的用戶類路徑剛好是含有包目錄的目錄。但是,假設我們想重新編譯該文件並且不關心我們在哪個目錄中的話,我們需要將\examples添加到用戶類路徑中。可以通過設置CLASSPATH達到此目的,但這裏我們將使用-classpath選項來完成。

C:>javac -classpath \examples\examples\greetings\Hi.java

如果再次將greetings.Hi改爲使用標題實用程序,該實用程序也需要通過用戶類路徑來進行訪問:

C:>javac -classpath \examples:\lib\Banners.jar \

\examples\greetings\Hi.java

要執行greetings中的類,需要訪問greetings和它所使用的類。

C:>java -classpath \examples:\lib\Banners.jargreetings.Hi

將源文件和類文件置於不同的目錄下經常是很有意義的,特別是在大型的項目中。我們用-d選項來指明單獨的類文件目標位置。由於源文件不在用戶類路徑中,所以用-sourcepath選項來協助編譯器查找它們。

C:> dir

classes\  lib\      src\

C:> dir src

farewells\

C:> dir src\farewells

Base.java     GoodBye.java

C:> dir lib

Banners.jar

C:> dir classes

C:> javac -sourcepath src -classpathclasses:lib\Banners.jar \

src\farewells\GoodBye.java -d classes

C:> dir classes

farewells\

C:> dir classes\farewells

Base.class     GoodBye.class

注意:編譯器也編譯了src\farewells\Base.java,雖然我們沒有在命令行中指定它。要跟蹤自動編譯,可使用-verbose選項。

這裏我們用 JDK 1.2 javac來編譯將在 1.1 版的虛擬機上運行的代碼。

C:> javac -target 1.1 -bootclasspathjdk1.1.7\lib\classes.zip \

-extdirs "" OldCode.java

-target 1.1

JDK 1.2 javac在缺省狀態下也將根據 1.2 版的自舉類來進行編譯,因此我們需要告訴javac讓它根據 JDK 1.1 自舉類來進行編譯。可用-bootclasspath-extdirs選項來達到此目的。不這樣做的話,可能會使編譯器根據 1.2 版的 API 來進行編譯。由於 1.1 版的虛擬機上可能沒有該 1.2 版的 API,因此運行時將出錯。

選項可確保生成的類文件與 1.1 版的虛擬機兼容。在 JDK1.2 中,缺省情況下 javac 編譯生成的文件是與 1.1 版的虛擬機兼容的,因此並非嚴格地需要該選項。然而,由於別的編譯器可能採用其它的缺省設置,所以提供這一選項將不失爲是個好習慣。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章