注意: javac 能夠隱式編譯一些沒有在命令行中說起的源文件。用 -verbose 選項可跟蹤自動編譯。 java
文件列表
爲縮短或簡化 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 將把類文件放到與源文件相同的目錄中。 app
-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 歸檔文件中查找類文件。 編程語言
-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.jar greetings.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 -classpath classes: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 版的虛擬機上運行的代碼。 spa
C:> javac -target 1.1 -bootclasspath jdk1.1.7\lib\classes.zip \
-extdirs "" OldCode.java
-target 1.1 選項可確保生成的類文件與 1.1 版的虛擬機兼容。在 JDK1.2 中, 缺省狀況下 javac 編譯生成的文件是與 1.1 版的虛擬機兼容的,所以並不是嚴格地須要該選項。然而,因爲別的編譯器可能採用其它的缺省設置,因此提供這一選項將不失爲是個好習慣。
JDK 1.2 javac 在缺省狀態下也將根據 1.2 版的自舉類來進行編譯,所以咱們須要告訴 javac 讓它根據 JDK 1.1 自舉類來進行編譯。可用 -bootclasspath 和 -extdirs 選項來達到此目的。不這樣作的話,可能會使編譯器根據 1.2 版的 API 來進行編譯。因爲 1.1 版的虛擬機上可能沒有該 1.2 版的 API,所以運行時將出錯
命令行