Java如何使用命令列編譯包
最近寫Java實驗報告的時候遇到了編譯包的問題,很煩。。。
問題:編寫一個類A,它位於包a中,儲存到A.java中,再編寫一個類B,它位於包b中,儲存到B.java中。在類B中例項化類A的一個物件。分別編譯類A和類B。
使用IDE編譯很方便,按要求建包再編譯就可以,但要是使用cmd就有一些坑。。。
首先我們建立如下的包關係:
包a:包b、A.java;包b:B.java(B中需要用到類A的物件,所以編譯時一定要先編譯A.java,再編譯B.java)
包a放在D盤中javacode資料夾中,位置是:"D:\javacode\a";
錯誤編譯方法:首先到包a的位置:"D:\javacode\a",先編譯A.java,成功編譯,生成A.class;再編譯B.java,提示找不到類A
至於為什麼會出錯?我想了很久才明白,我們理一下整個編譯過程:(仔細體會)
編譯A.java時,首先要找到A.java在哪裡?此時我們的位置是"D:\javacode\a",A.java就在a的直接目錄下,此時系統能找到A.java,所以直接使用"javac A.java"進行編譯,會在這個位置生成A.class;然後編譯B.java時,B.java位於包a中的包b裡,這時系統在這個位置就找不到B.java了,我們需要進入包b才能找到B.java,所以我們這樣寫:"javac b\B.java";但是卻提示不能找到類A,為什麼呢?我們需要弄明白它是怎麼找類A的?B.java使用import語句把類A新增到B.java中,我們看import語句怎麼寫的就知道系統是怎麼找類A的了,import a.*意味著我們要先找到包a,我們現在的位置是:"D:\javacode\a",但是在這個位置是找不到包a的,可能有人會疑惑這不就是包a的位置嗎,怎麼會找不到包a?其實真的找不到,此時系統在這個位置能看到的只有包b、A.java和A.class,是無法找到包a的(如下圖所示),所以就出錯了。
那我們怎麼解決這個問題呢?我目前只知道兩種解決方法,如果有其他方法的歡迎補充
方法一:使用-d編譯
格式:javac -d<位置a> A.java
表示的意思是在位置a裡生成一個同包名(你需要編譯的包的包名)的包,包裡面只包含編譯後的class檔案
一般使用:javac -d . A.java(‘.’表示當前位置,‘.’兩邊有空格不能省略)
使用這種方法進行編譯:
編譯後:在包a裡又產生了一個和a同名的包,這樣在編譯B.java時就能找到包a了,而且包a裡有A.class
我們開啟新產生的包a:新包與舊包有相同的結構,裡面有編譯A.java產生的A.class檔案、包b;包b中有編譯B.java產生的B.class
開啟包b:包b中有編譯B.java產生的B.class
方法二:我們不進入要編譯包的這一層,而是上一層
我們只進入到"D:javacode",而不是"D:javacode\a",這樣做是為了編譯B.java時能找到包a,我們在包a的上一層就能看到包a了,這麼做不會產生新包,只是在java檔案的位置產生class檔案
編譯過程:
包a的變化:
包b的變化: