javac編譯class文件
今天,筆者遇到了一個小問題:在使用原始的javac編譯Java類文件時,如果當前類文件對其他類有依賴,那麼,就可能會出現問題。
舉例如下:筆者在桌面新建一個文件夾test,然後建立兩個類:A.java和B.java,如下圖:
兩個類的代碼都很簡單,其中B類對A類有依賴:
然後,我們分3種情況分析:
情況① :
直接用javac命令編譯兩個源文件(先編譯被依賴的類A,再編譯類B),結果如下:
可以看到編譯成功,生成了對應的class文件。
情況②:
刪去情況①中生成的class文件,我們在B.java中利用import語句導入一個包:
然後重新編譯這兩個文件,結果如下:
可以看到,B.java文件編譯失敗,這是因爲javax.servlet.*包並非Java標準類庫中的內容,因此編譯器找不到對應的包,就會出錯。
我們將需要的jar文件放入當前目錄,並使用-cp參數將庫文件導入,然後繼續編譯:
編譯結果如下:
此時,依舊編譯失敗,但提示的是找不到類A,這是因爲,默認情況下,編譯器會在當前目錄下尋找需要的類文件,我們使用cp參數修改了類文件查找路徑,而並沒有包含當前目錄,因此,編譯失敗。我們在使用cp參數時,需要將當前目錄包含進去:
可以看到編譯成功。
情況③:
刪除情況②生成的class文件,我們在A.java和B.java文件中添加package語句,將文件夾test記錄在代碼中:
繼續使用情況②中編譯成功的命令來編譯,結果如下:
可以看到,編譯器再一次找不到類A,這是因爲,添加了package語句後,編譯器需要找的是test.A類,編譯器會首先找到test目錄,然後再從test目錄中找到A,此時當前目錄中(test目錄內)不存在test子目錄,因此,編譯器找不到A類,編譯失敗。這說明我們包含的類路徑需要包括類所在的包,這裏需要包含test目錄的上一級子目錄。
修改命令行,編譯結果如下:
可以看到,編譯成功。
通過對以上三種情況的分析,這裏總結如下:
(1)利用javac進行編譯時,默認情況下的類搜索路徑爲當前路徑。
(2)如果類中包含了Java標準類庫中以外的類,則需要利用-cp參數指定類搜索路徑。
(3)如果需要的類指定了類所在的包,那麼-cp參數指定的類搜索路徑應包含該類所在的包。