如何使用 java 命令執行含有包的程式
有時候我們會嘗試使用 javac 和 java 命令來讓我們的程式執行起來,一般情況下這是不會出現什麼問題的。但是一旦我們新增包之後,事情就變得有些不可捉摸了,這時候命令不對的話,往往就會出現 “錯誤:找不到或無法載入主類” 這個惱人的錯誤。我們先來簡單復現一下上述連結中使用包時出現的錯誤。
錯誤復現
我們或多或少會注意到 Eclipse、Netbeans 等 IDE 都是將程式原始碼放到 src 資料夾下的。現在我們在 E:\test 資料夾下就有一個 src 子資料夾。在 src 中我們編寫了如下 HelloWorld.java 程式:
package pers.admin.test;
public class HelloWorld {
public static void main (String[] args) {
System.out.println("Hello World!");
}
}
專案樹形圖如下:
然後我們很自然的想到使用 javac 來編譯此 java 類,當然我們此時也不忘指定 java 類的路徑:
從樹狀圖中我們可以得知我們編譯成功了,此時,依照慣性我們就會仿照上述命令寫出如下命令執行 java 位元組碼檔案:
怎麼會找不到主類!一臉茫然的我們可能會進行下面三種無用的掙扎:
此時,我們應該反省上述程式的 HelloWorld.java 的類名真的只是叫 HelloWorld 麼?
根據結果當然不是,事實是:一個類的全名應該是包名 + 類名
好了,有了類全名的定義,我們進行如下嘗試:
可以看到果然不出所料的成功了。
問題進一步延伸
當觀察 IDE 檔案結構的時候,我們會發現 src 目錄下其實並沒有那些雜亂的 .class 檔案。反而 .class 檔案多集中在 bin 這個資料夾下。這是為什麼呢?因為 IDE 在用 javac 命令的時候指定了 .class 檔案輸出的路徑。我們要怎麼指定呢?很簡單,就是使用 -d 引數:
我們來試試,不過我們得手動建好 bin 資料夾。
可以看到這裡 .class 檔案的確是在另一個資料夾裡了。那麼此時我們應該怎麼用 java 命令執行這個位元組碼檔案呢?其實上面已經劇透了一點,就是使用 java 的 -cp 引數:
這裡就沒什麼好說了。
另外說一句,原來之前自己碰到過這個問題,結果現在遇到還是像是沒長記性一樣…