1. 程式人生 > >Java如何使用命令列編譯包

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的變化: