天天看點

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 的代碼應該在 workspacecommysoftmypackMyClass.java 中。

預設情況下,編譯器将每一個類檔案與其源檔案放在同一檔案夾中。可用 -d 選項(請參閱後面的選項)指定其他目标檔案夾。

工具讀取用 Java 程式設計語言編寫的類和接口定義,并将它們編譯成位元組碼類檔案。

查找類型

當編譯源檔案時,編譯器常常須要它還沒有識别出的類型的有關資訊。對于源檔案裡使用、擴充或實作的每一個類或接口,編譯器都須要其類型資訊。這包含在源檔案裡沒有明白提及、但通過繼承提供資訊的類和接口。

比如,當擴充 java.applet.Applet 時還要用到 Applet 的祖先類:java.awt.Panel 、 java.awt.Container、 java.awt.Component 和java.awt.Object。

當編譯器須要類型資訊時,它将查找定義類型的源檔案或類檔案。編譯器先在自舉類及擴充類中查找,然後在使用者類路徑中查找。使用者類路徑通過兩種途徑來定義:通過設定 CLASSPATH 環境變量或使用 -classpath 指令行選項。(有關具體資料,請參閱設定類路徑)。假設使用 -sourcepath 選項,則編譯器在sourcepath 指定的路徑中查找源檔案;否則,編譯器将在使用者類路徑中查找類檔案和源檔案。可用-bootclasspath 和 -extdirs 選項來指定不同的自舉類或擴充類;參閱以下的聯編選項。

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

搜尋結果僅僅生成類檔案而沒有源檔案: javac 使用類檔案。

搜尋結果僅僅生成源檔案而沒有類檔案: javac 編譯源檔案并使用由此生成的類檔案。

搜尋結果既生成源檔案又生成類檔案: 确定類檔案是否過時。若類檔案已過時,則 javac 又一次編譯源檔案并使用更新後的類檔案。否則, javac 直接使用類檔案。

預設情況下,僅僅要類檔案比源檔案舊, javac 就覺得它已過時。( -Xdepend 選項指定相對來說較慢但卻比較可靠的過程。)

注意: javac 能夠隐式編譯一些沒有在指令行中提及的源檔案。用 -verbose 選項可跟蹤自己主動編譯。

檔案清單

為縮短或簡化 javac 指令,能夠指定一個或多個每行含有一個檔案名稱的檔案。在指令行中,採用 '@' 字元加上檔案名稱的方法将它指定為檔案清單。當 javac 遇到以 `@' 字元開頭的參數時,它對那個檔案裡所含檔案名稱的操作跟對指令行中檔案名稱的操作是一樣的。這使得 Windows 指令行長度不再受限制。

比如,能夠在名為 sourcefiles 的檔案裡列出全部源檔案的名稱。該檔案可能形如:

MyClass2.java

MyClass3.java

然後可用下列指令執行編譯器:

選項

編譯器有一批标準選項,眼下的開發環境支援這些标準選項,将來的版本号也将支援它。另一批附加的非标準選項是眼下的虛拟機實作所特有的,将來可能要有變化。非标準選項以 -X 打頭。

标準選項

-classpath 類路徑

設定使用者類路徑,它将覆寫 CLASSPATH 環境變量中的使用者類路徑。若既未指定 CLASSPATH 又未指定 -classpath,則使用者類路徑由目前檔案夾構成。有關具體資訊,請參閱設定類路徑。

若未指定 -sourcepath 選項,則将在使用者類路徑中查找類檔案和源檔案。

-d 檔案夾

設定類檔案的目标檔案夾。假設某個類是一個包的組成部分,則 javac 将把該類檔案放入反映包名的子檔案夾中,必要時建立檔案夾。比如,假設指定 -d c:myclasses 而且該類名叫 com.mypackage.MyClass,那麼類檔案就叫作 c:myclassescommypackageMyClass.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 greetingsHello.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 greetingsHello.java

Hello.class Hello.java

C:> java greetings.Hello World Universe Everyone

Hello World

Hello Universe

Hello Everyone

編譯多個源檔案

該示範例子編譯 greetings 包中的全部源檔案。

greetings\

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

C:> javac greetings*.java

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

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

指定使用者類路徑

對前面示範例子中的某個源檔案進行更改後,又一次編譯它:

C:> cd

examples

C:> javac greetingsHi.java

因為 greetings.Hi 引用了 greetings 包中其他的類,編譯器須要找到這些其他的類。上面的示範例子能執行是因為預設的使用者類路徑剛好是含有封包件夾的檔案夾。可是,假設我們想又一次編譯該檔案而且不關心我們在哪個檔案夾中的話, 我們須要将 examples 增加到使用者類路徑中。能夠通過設定 CLASSPATH 達到此目的,但這裡我們将使用 -classpath 選項來完成。

C:>javac -classpath examples examplesgreetingsHi.java

假設再次将 greetings.Hi 改為使用标題有用程式,該有用程式也須要通過使用者類路徑來進行訪問:

C:>javac -classpath examples:libBanners.jar \

examplesgreetingsHi.java

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

C:>java -classpath examples:libBanners.jar greetings.Hi

将源檔案和類檔案分開

将源檔案和類檔案置于不同的檔案夾下常常是非常有意義的,特别是在大型的項目中。我們用 -d 選項來指明單獨的類檔案目标位置。因為源檔案不在使用者類路徑中,是以用 -sourcepath 選項來協助編譯器查找它們。

classes lib src\

C:> dir src

farewells\

C:> dir srcfarewells

Base.java GoodBye.java

C:> dir lib

Banners.jar

C:> dir classes

C:> javac -sourcepath src -classpath classes:libBanners.jar \

srcfarewellsGoodBye.java -d classes

C:> dir classesfarewells

Base.class GoodBye.class

注意:編譯器也編譯了 srcfarewellsBase.java,盡管我們沒有在指令行中指定它。要跟蹤自己主動編譯,可使用 -verbose 選項。

聯程式設計式示範例子

這裡我們用 JDK 1.2 的 javac 來編譯将在 1.1 版的虛拟機上執行的代碼。

C:> javac -target 1.1 -bootclasspath jdk1.1.7libclasses.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 版的虛拟機相容的,是以并非嚴格地須要該選項。然而,因為别的編譯器可能採用其他的預設設定,是以提供這一選項将不失為是個好習慣。