手動編譯含package的java源程序(包含外部包中定義的類)


1)定義一個GSM類,如下:

包名是“SRC.GSM”,並且此程序引用了外部jar包。使用javac命令對GSM.java進行編譯:

GSM.java所在的文件夾如下所示:

 

切換到這個目錄為當前工作目錄,使用javac編譯(http://www.cnblogs.com/Yogurshine/p/3170554.html):

 

使用-classpath參數指明外部類的路徑(-classpath參數后沒有”=“),以使import語句找到類的定義,-d參數是表示直接生成包的結構(就是創建SRC/GSM/GSM.class),其后的"."表示生成的包的結構就存儲到本工作目錄下,因此最終的結果如下:

最終在工作目錄下生成了SRC/GSM/GSM.class。上述如果不使用-d參數的話,就只是直接生成GSM.class文件。

接下來就是對gauss.java進行編譯,不過gauss這個類調用了GSM這個類,所以要先編譯GSM這個類之后才能編譯gauss類,不過沒有成功,如下所示:

提示找不到GSM所在的包“LZ.SRC.a”(修改了GSM的源碼,package后的一個字符串就是包名,也就是各個文件夾的名字),原因就在於我們在設置了“-classpath”,這里只是臨時修改了編譯器編譯類時所需要的類的路勁(在計算機中配置的classpath這時暫時被覆蓋),因此在編譯gauss類的時候就只在“lib\jmatio.jar”中查找GSM.class所在的包,明顯找不到嘛。因此需要再給-classpath一個配置值,就是".",當前目錄。這樣在“lib\jmatio.jar”中找不到GSM.class,就會在當前目錄找,編譯成功,如下:

 

Windows下使用javac命令,有多個jar包時多個jar包的路徑以“;”分割開

而與Windows不同的是,Linux下多個jar包以“:”分隔開。

雖然有個警告,但是編譯成功了(警告出現的原因是使用Arraylist泛型創建對象的時候,未指明具體類型 ArrayList a=new ArrayList()。正確的范方式是:ArrayList<Integer> a=new ArrayList<Integer>())。以上就完成了包含外部包的類的編譯。

最后,如果兩個類存放在同一個包中,那么不用使用import語句就可以直接使用類定義對象(例如在一個java文件中定義若干類,那么這些類中不是有import語句就可以直接互相使用,但是只允許有一個public類),另外,即使是在多個java文件中定義多個類,並且在第一行(包定義必須寫在首行)沒有定義package,在這些java文件中還是可以直接使用外部類而不用import語句,原因就是雖然沒有寫package語句,但是IDE編譯的時候加上了package語句,並且是這些java文件是相同的package。

2)java提高了一種壓縮機制,就是把大量的class文件打包成一個壓縮文件,這個壓縮文件就稱為jar包。使用jar命令生成jar包;

lz.jar是生成的jar包的名稱,而之后的“LZ”是待打包的包結構,是之前編譯生成的GSM.class(LZ/SRC/a/GSM.class)和gauss.class(LZ/SRC/b/GSM.class)。jar包可是使用常用的解壓軟件打開,結構如下:

 

使用以下命令運行jar包:

 

java -jar lz.jar

不過,你發現這是不行的,提示“lz.jar”中沒有主清單屬性,這就要修改MANIFEST.MF的內容了,設置主類,不過,我還是沒弄成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM