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的變化:
Java如何使用命令行編譯包