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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM