今天在使用命令行編譯時遇到些問題,順便又仔細分析了一些基礎知識,記錄總結一下。

下面使用javac和java命令都是在D:/Workspace/java目錄下執行的:

1 //Inner.java 2 package cn.inner; 3 public class Inner 4 { 5 public static void show() 6 { 7 System.out.View Codejavac-d.Inner.java
javacDoTest.java

折騰半天,最終把Inner.java刪掉、重命名都能夠使DoTest.java編譯成功。
自己思索半天,想到一個合理的解釋:javac命令在編譯源文件時,如果源文件中有對其他類的調用(例如本例中的Inner類的調用),
它首先會在與源文件相同的目錄下(即是與該類相同的包下)尋找是否有該類存在,在示例中發現了Inner.java源文件存在(該源文件中肯定存在一個Inner類),
但是事實上Inner.java是屬于cn.inner包下的類,即cn.inner.Inner。檢查到這里,javac命令就報錯了,提示錯誤的源文件...
為了進一步證實我的假設,我修改DoTest.java文件,增加了默認包名:
packagesrc;
在當前目錄下執行:
Javac-d.DoTest.java
成功!
這時在分析下DoTest.java原源文件中導入的其它類:
由于該源文件中有導入cn.inner.Inner類,在使用javac命令編譯時,該命令會按照classpath環境變量的路徑去搜索導入的類,我的環境變量中有配置".",
所以在當前目錄下可以正確尋找到cn.inner.Inner類,在當前目錄下執行javacDoTest.java命令成功
但是在執行javaDoTest命令時,出現下面的結果

這時才發現原來DoTest.java中增加了包名的限制,所以需要把DoTest.class文件移到src目錄下,或者編譯時加上"-d."參數,即javac-d.DoTest.java命令
再執行javasrc/DoTest成功

總結:java中包名的層級關系是用目錄來體現的,比如cn.inner包就對應cn/inner這兩層目錄,在編譯代碼的過程中,如果有import其他包中的類,
則使用javac命令的命令行窗口的目錄必須可以按照classpath環境變量的路徑搜索到import進來的類。另外值得一提的是,編譯后的類都應該按照包名規定放在指定目錄下,
還需要注意被引入的類的源文件和使用引入類的源文件不能放在一起,除非兩個文件都是默認包,如果是這種情況也不會使用import引入另外一個類了。
當然,我今天提到的這些問題,在IDE開發中一般都不會遇到,只是覺得這樣能夠更加深刻的理解java的一些基礎問題。
新聞熱點
疑難解答