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

Java如何使用命令行編譯包

解決方法 出錯 container sele ali aaaaa 命令行編譯 display ext

最近寫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如何使用命令行編譯包