有時候咱們須要直接用jdk提供的java命令來執行class文件讓軟件運行起來,特別是不少初學者,但常常會發現以下提示:java
用eclipse或用ant則沒有問題。app
其實緣由很簡單,咱們忽略了2個細節。eclipse
1.java指令默認在尋找class文件的地址是經過CLASSPATH環境變量中指定的目錄中尋找的。blog
2.咱們忽略了package的影響。ip
第一個問題好解決:編譯
咱們直接在CLASSPATH環境變量中加入「.;」便可。「.」的意思是搜索當前目錄class
第二個問題看下面分析:基礎
看下面兩個類變量
類A 類Bcli
類A和類B的惟一差異就是沒有定義包名。
咱們的工程路徑是D:\HelloWorld,在HelloWorld文件夾中創建一個src文件夾,類B的源代碼文件就放在src中。用javac編譯完之後
會在src文件夾中生成NewsManager.class,以下
執行以下:
如今咱們再把源代碼換成類A
爲何加入了package後就不對了呢?
類A中package的路徑是org.will.app.main。按照java規定,咱們應該按照package定義的路徑來存放源文件,類A應該放入:
src\org\will\app\main下,以下:
而後咱們編譯執行:
依然有問題,爲何,其實你們再回去看看java的書籍就會發現,一個類的全名應該是包名+類名。類A的全名:org.will.app.main.NewsManager
好的,再試試:
仍是不對。爲何?
仔細看上面的圖,咱們在main目錄下讓java命令去執行org.will.app.main.NewsManager,其實它會覺得類的路徑是:
D:\HelloWorld\src\org\will\app\main\org\will\app\main\NewsManager,你們看到了吧,路徑重複了。
因此,咱們應該這樣執行:
成功!
總結:
1、java執行class文件是根據CLASSPATH指定的地方來找,不是咱們理解當前目錄。若是但願它查詢當前目錄,須要在CLASSPATH中加入「.;」,表明當前目錄。
2、java執行class文件對package的路徑是強依賴的。它在執行的時候會嚴格以當前用戶路徑爲基礎,按照package指定的包路徑轉化爲文件路徑去搜索class文件。各位同窗之後注意就OK啦。至於網上說的要在CLASSPATH要加各類包等等都是泛泛而談,真正靜下心分析這個問題的資料很少。不少都沒有說到點子上,會誤導人的。