【java】javac編譯class文件

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參數指定的類搜索路徑應包含該類所在的包。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章