javac [ options ] [ sourcefiles ] [ @files ]參數可按隨意次序排列。html
options
- 命令行選項。
sourcefiles
- 一個或多個要編譯的源文件(好比 MyClass.java)。
@files
- 一個或多個對源文件進行列表的文件。
javacjava
有兩種方法可將源碼文件名稱傳遞給 javac:編程
- 假設源文件數量少,在命令行上列出文件名稱就能夠。
- 假設源文件數量多,則將源文件名稱列在一個文件裏,名稱間用空格或回車行來進行分隔。而後在 javac 命令行中使用該列表文件名稱,文件名稱前冠以 @ 字符。
源碼文件名稱稱必須含有
.java
後綴,類文件名稱稱必須含有.class
後綴,源文件和類文件都必須有識別該類的根名。好比,名爲MyClass
的類將寫在名爲MyClass.java
的源文件裏,並被編譯爲字節碼類文件MyClass.class
。app內部類定義產生附加的類文件。這些類文件的名稱將內部類和外部類的名稱結合在一塊兒,好比
MyClass$MyInnerClass.class
。編程語言應當將源文件安排在反映其包樹結構的文件夾樹中。好比,假設將所有的源文件放在 /workspace 中,那麼
com.mysoft.mypack.MyClass
的代碼應該在 \workspace\com\mysoft\mypack\MyClass.java 中。工具缺省狀況下,編譯器將每個類文件與其源文件放在同一文件夾中。可用 -d 選項(請參閱後面的選項)指定其餘目標文件夾。優化
工具讀取用 Java 編程語言編寫的類和接口定義,並將它們編譯成字節碼類文件。
當編譯源文件時,編譯器經常需要它還沒有識別出的類型的有關信息。對於源文件裏使用、擴展或實現的每個類或接口,編譯器都需要其類型信息。這包含在源文件裏沒有明白說起、但經過繼承提供信息的類和接口。編碼
好比,當擴展 java.applet.Applet 時還要用到 Applet 的祖先類:java.awt.Panel 、 java.awt.Container、 java.awt.Component 和java.awt.Object。spa
當編譯器需要類型信息時,它將查找定義類型的源文件或類文件。編譯器先在自舉類及擴展類中查找,而後在用戶類路徑中查找。用戶類路徑經過兩種途徑來定義:經過設置 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: {keyword列表}
- 僅僅生成某些類型的調試信息,這些類型由逗號分隔的keyword列表所指定。有效的keyword有:
- 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.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 版的虛擬機上執行的代碼。
C:> javac -target 1.1 -bootclasspath jdk1.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 版的虛擬機兼容的,所以並不是嚴格地需要該選項。然而,由於別的編譯器可能採用其餘的缺省設置,因此提供這一選項將不失爲是個好習慣。