1. 程式人生 > >javac命令詳解(上)

javac命令詳解(上)

基礎 tcl clear 升級 class been java類 jre 文件中查找

javac命令用與編譯java源碼文件,其語法格式如下: javac [ options ] [ sourcefiles ] [ @files ] 參數可按任意次序排列。 options 命令行選項。 sourcefiles 一個或多個要編譯的源文件(例如 MyClass.java)。 @files 一個或多個對源文件進行列表的文件。 有兩種方法可將源代碼文件名傳遞給 javac: 一種是通過sourcefiles參數,直接給出要編譯的源文件 如果源文件數量少,可以用這種方式,在命令行上列出文件名即可。文件與文件之間用空格非分開就可以了
實例1 javac -d classes src\com\robin\Hello.java src\com\robin\People.java src\com\hubin\Util.java。 其實這裏的源碼文件每個都是單獨的參數,如果文件路徑包括有空格,可以用雙引號把該文件名括起來。 比如上面的命令可以寫成下面的樣子: 示例2 javac -d classes "src\com\robin\Hello.java" "src\com\robin\People.java" "src\com\hubin\Util.java" 在沒使用分號的情況下,對相同路徑下的Java源碼文件可以使用統配符,比如
示例1可以寫成: 示例3 javac -d classes src\com\robin\*.java src\com\hubin\Util.java 一種是通過@files參數 為縮短或簡化javac命令,可以把要編譯的java源文件名列在一個文件,文件名之間用空格或回車進行分割。然後在javac命令行中,可以用‘@‘ 字符加上包含有要編譯java源文件名的文件名來指定要編譯的java源文件。因為javac當遇到以 `@‘ 字符,它就會對該字符後的文件所列出的所有java源文件進行編譯。這種形式適用於java源文件很多的情況。 比如,我們把示例1要編譯的源文件名包含在src.txt文件中。
示例4 src.txt文件 src\com\robin\Hello.java src\com\robin\People.java src\com\hubin\Util.java 然後運行如下的javac命令: javac -d classes @src.txt 當然我們可以在src.txt中用雙引號把單個要編譯的java源碼文件括起來, 但是這時路徑直接的分隔符“\”就要寫成"\\"的形式了。 示例5 src.txt文件 "src\\com\\robin\\Hello.java" "src\\com\\robin\\People.java" "src\\com\\hubin\\Util.java" 這時javac命令仍然同示例3. 命令選項options 路徑 -d 目錄 該選項用於指定生成的class目標文件的目錄。如果某個類是一個包的組成部分,則 javac 將把該類文件放入反映包名的子目錄中,必要時創建目錄。比如,示例1中的class目標目錄就放classes下,Hello.classPeople.class位於classes\com\robin下,Util.class位於classes\com\hubin目錄下。 若未指定 -d 選項,則 javac 將把類文件放到與源文件相同的目錄中。 註意: -d 選項指定的目錄不會被自動添加到用戶類路徑中。 -bootclasspath,-extdirs,-classpath和-cp JDK在編譯一個java源文件時,搜索類文件的方式和順序如下:   Bootstrap classes,Extension classes,User classes   Bootstrap默認的是JDK自帶的jar或zip文件,它包括jre\lib下rt.jar等文件,JDK首先搜索這些文件. 可以通過-bootclasspath來設置它。文件之間用分號";"進行分割。   Extension默認的是位於jre"lib"ext目錄下的jar文件,JDK在搜索完Bootstrap後就搜索該目錄下的jar文件. 可以通過-extdirs來設置。文件之間用分號";"來進行分割   User classes搜索順序為當前目錄、環境變量 CLASSPATH、-classpath   -cp -classpath 是同義詞,參數意義是一樣的。classpath參數太長了,所以提供cp作為縮寫形式   它們用於告知JDK搜索目錄名、jar文檔名、zip文檔名,用分號";"進行分隔。   例如當你自己開發了公共類並包裝成一個common.jar包,在使用 common.jar中的類時,就需要用-classpath common.jar 告訴JDK從common.jar中查找該類,否則JDK就會拋出java.lang.NoClassDefFoundError異常,表明未找到類定義。   使用-classpath後JDK將不再使用CLASSPATH中的類搜索路徑,如果-classpath和CLASSPATH都沒有設置,則JDK使用當前路徑(.)作為類搜索路徑。   推薦使用-classpath來定義JDK要搜索的類路徑,而不要使用環境變量 CLASSPATH的搜索路徑,以減少多個項目同時使用CLASSPATH時存在的潛在沖突。例如應用1要使用a1.0.jar中的類G,應用2要使用 a2.0.jar中的類G,a2.0.jar是a1.0.jar的升級包,當a1.0.jar,a2.0.jar都在CLASSPATH中,JDK搜索到第一個包中的類G時就停止搜索,如果應用1應用2的虛擬機都從CLASSPATH中搜索,就會有一個應用得不到正確版本的類G。 示例6javac -classpath lib\Util.zip -d classes src\com\robin\*.java 或 javac -cp lib\Util.zip -d classes src\com\robin\*.java 示例7javac -classpath classes -d classes src\com\robin\*.java 或javac -cp classes -d classes src\com\robin\*.java 如果需要指定各個JAR文件具體的存放路徑,相同路徑有多個可使用通配符。 -sourcepath java源碼文件路徑 在編譯時,JDK需要兩方面的路徑,一個是查找java源碼文件的路徑,一個是查找class(類)文件的路徑。 關於class文件的路徑上文已經已經介紹過,可以通過-bootclasspath,-extdirs,-classpath和-cp來設定。java源碼文件的路徑則可以通過 -sourcepath來設定,默認情況下-sourcepath和-classpath的路徑一樣。在編譯的過程中,若需要相關java類的則首先在sourcefiles或@files列出的java源碼文件中查找並編譯,如果沒找到,就在-sourcepath指定的路徑中查找java源碼文件,這時無論找沒找到都會繼續在類路徑中進行查找。如果在sourcepath中找到了java源碼文件,但是在類路徑中沒有找到了相關的類,或找的類位於包文件(jar或zip)中, 或找的類並不是在包文件中,但源碼文件比該類文件新,這時會對源碼文件進行編譯,而且編譯生成的類文件將會和你指定要進行編譯的java源碼所生成的類文件位於同一根目錄。否則,除了即沒找到java源碼文件也沒找到相關類就編譯失敗外,直接載入相關類就可以了。因此你得至少要指定一個要編譯的java源文件。它並不是指定sourecfiles或@files中指定的要編譯的java源碼文件的根目錄。與類路徑一樣,java源碼路徑項用分號 (;) 進行分隔,它們可以是class文件的根目錄、JAR 歸檔文件或 ZIP 歸檔文件。 示例8javac -sourcepath src -d classes src\com\robin\Hello.java 示例9javac -cp lib\Util.zip -sourcepath src -d classes src\com\robin\*.java 關於編譯器編譯java源碼的詳細過程可開啟-verbose進行參看,關於-verbose的詳細內存請參照《javac命令詳解(下) -source和-target -source 版本 當你從sun安裝了某個版本的JDK,而其實該JDK卻包含多個版本的編譯器。-source參數就是指定用哪個版本的編譯器對java源碼進行編譯。如果你的java源碼不符合該版本編譯器的規範的話,當然就不能編譯通過。 -target 版本 該命令用於指定生成的class文件將保證和哪個版本的虛擬機進行兼容。我們可以通過-target 1.2來保證生成的class文件能在1.2虛擬機上進行運行,但是1.1的虛擬機就不能保證了。因為java虛擬機的向前兼容行,1.5的虛擬機當然也可以運行通過-target 1.2讓生成的class文件。 每個版本編譯器的默認-target版本是不太一樣的, 比如 JDK1.2版本編譯器支持-target 1.1,-target 1.2,-target 1.3,-target 1.4,-target 1.5,-target 1.6,它默認的就是1.1 JDK1.4版本編譯器只支持-target 1.4 和-target 1.5 JDK1.5版本編譯器就只支持-target 1.5 示例10 javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.1 -d classes src\com\robin\*.java javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.3 -d classes src\com\robin\*.java javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.4 -d classes src\com\robin\*.java javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.5 -d classes src\com\robin\*.java javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.6 -d classes src\com\robin\*.java 示例11 javac -cp lib\Util.zip -sourcepath src -source 1.4 -target 1.4 -d classes src\com\robin\*.java javac -cp lib\Util.zip -sourcepath src -source 1.4 -target 1.5 -d classes src\com\robin\*.java -deprecation 如果java源碼中使用了的不鼓勵使用的類或類的Field或類的方法或類的方法覆蓋,那麽如果使用了該參數,將顯示關於此的的詳細信息,否則只有個簡單的Note. 示例12: D:\project\test>javac -cp lib\Util.zip -sourcepath src -source 1.2 -target 1.6 - d classes src\com\robin\*.java Note: src\com\robin\Hello.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. D:\project\test>javac -cp lib\Util.zip -sourcepath src -deprecation -d classes s rc\com\robin\*.java src\com\robin\Hello.java:11: warning: [deprecation] destroy() in java.lang.Threa d has been deprecated t.destroy(); ^ 1 warning -encoding 設置源文件編碼名稱,例如UTF-8。若未指定 -encoding 選項,則使用平臺缺省的編碼方式。 -g 生成所有的調試信息,包括局部變量。缺省情況下,只生成行號和源文件信息。 -g:none 不生成任何調試信息。 -g:{關鍵字列表} 只生成某些類型的調試信息,這些類型由逗號分隔的關鍵字列表所指定。有效的關鍵字有: source 源文件調試信息 lines 行號調試信息 vars 局部變量調試信息 -nowarn 禁用警告信息。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net

javac命令詳解(上)