在 IDE(如 Eclipse)中開發測試皆正常,但改用記事本撰寫、在 DOS 命令列以 javac 編譯成功、卻以 java 執行時噴出 Exception in thread "main" java.lang.NoClassDefFoundError,這是初學者最常遇到的套件路徑問題。
package com.deco;
import java.util.*;
public class Test {
public static void main(String args[]) {
System.out.println("Hello package!!!");
}
}
package com.deco; 後可編譯執行,確定是套件名稱導致類別載入失敗。類別 com.deco.Test 編譯後需產生目錄結構 com/deco/Test.class。執行時 當前工作目錄必須是套件根目錄的上一層,並以完整類別名啟動。
javac -d . Test.java
-d . 代表將編譯輸出至當前目錄下,自動建立 com/deco/ 資料夾並放入 Test.class。
java com.deco.Test
錯誤示範:cd com/deco 後執行 java Test 或 java com.deco.Test 皆會失敗,因為 JVM 會從當前目錄尋找 com/deco/Test.class,但你已在 deco 資料夾內,找不到上層 com 目錄。
project/ ← 執行 java 指令的位置(CLASSPATH 包含 .)
├── com/
│ └── deco/
│ └── Test.class
└── Test.java
「編譯用
-d產生資料夾,執行站在套件根目錄的父目錄,打全名。」
若類別檔不在當前目錄下,可用 -cp 或 -classpath 指定根目錄:
java -cp /path/to/project com.deco.Test