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的內容了,設置主類,不過,我還是沒弄成。