有時候我們需要直接用jdk提供的java命令來執行class檔案讓軟體執行起來,特別是很多初學者,但經常會發現如下提示:
用eclipse或用ant則沒有問題。
其實原因很簡單,我們忽略了2個細節。
1.java指令預設在尋找class檔案的地址是透過CLASSPATH環境變數中指定的目錄中尋找的。
2.我們忽略了package的影響。
第一個問題好解決:
我們直接在CLASSPATH環境變數中加入“.;”即可。“.”的意思是搜尋當前目錄
第二個問題看下面分析:
看下面兩個類
類A
類B
類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,大家看到了吧,路徑重複了。
所以,我們應該這樣執行:
成功!
總結:
一、java執行class檔案是根據CLASSPATH指定的地方來找,不是我們理解當前目錄。如果希望它查詢當前目錄,需要在CLASSPATH中加入“.;”,代表當前目錄。
二、java執行class檔案對package的路徑是強依賴的。它在執行的時候會嚴格以當前使用者路徑為基礎,按照package指定的包路徑轉化為檔案路徑去搜索class檔案。各位同學以後注意就OK啦。至於網上說的要在CLASSPATH要加各種包等等都是泛泛而談,真正靜下心分析這個問題的資料不多。很多都沒有說到點子上,會誤導人的。
有時候我們需要直接用jdk提供的java命令來執行class檔案讓軟體執行起來,特別是很多初學者,但經常會發現如下提示:
用eclipse或用ant則沒有問題。
其實原因很簡單,我們忽略了2個細節。
1.java指令預設在尋找class檔案的地址是透過CLASSPATH環境變數中指定的目錄中尋找的。
2.我們忽略了package的影響。
第一個問題好解決:
我們直接在CLASSPATH環境變數中加入“.;”即可。“.”的意思是搜尋當前目錄
第二個問題看下面分析:
看下面兩個類
類A
類B
類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,大家看到了吧,路徑重複了。
所以,我們應該這樣執行:
成功!
總結:
一、java執行class檔案是根據CLASSPATH指定的地方來找,不是我們理解當前目錄。如果希望它查詢當前目錄,需要在CLASSPATH中加入“.;”,代表當前目錄。
二、java執行class檔案對package的路徑是強依賴的。它在執行的時候會嚴格以當前使用者路徑為基礎,按照package指定的包路徑轉化為檔案路徑去搜索class檔案。各位同學以後注意就OK啦。至於網上說的要在CLASSPATH要加各種包等等都是泛泛而談,真正靜下心分析這個問題的資料不多。很多都沒有說到點子上,會誤導人的。