// Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("hello");
}
}
編譯:javac Hello.java → 產生 Hello.class
執行:java Hello(在 .class 同目錄下)
// 目錄結構:c:/Java/hello/my/Hello.java
package my;
public class Hello {
public static void main(String[] args) {
System.out.println("hello");
}
}
編譯:在 c:/Java/hello 目錄下執行 javac my/Hello.java
執行:在 c:/Java/hello 目錄下執行 java my.Hello
關鍵規則:源檔必須置於對應包目錄下;編譯時路徑相對「包根目錄」;執行時使用全限定類名。
# 編譯
javac -cp .;lib/foo.jar;lib/bar.jar MyClass.java
# 執行
java -cp .;lib/foo.jar;lib/bar.jar com.example.MyClass
. 代表當前目錄(含無包類別)。; 分隔,Linux/macOS 用 :。| 錯誤現象 | 可能原因 | 解決方向 |
|---|---|---|
Could not find or load main class | 類名錯誤、classpath 缺少包根目錄、包名與目錄不符 | 檢查全限定名、確認 -cp 包含包根、目錄結構匹配包名 |
NoClassDefFoundError | 編譯時有但運行時缺少依賴 JAR | 運行時 -cp 加入該 JAR |
ClassNotFoundException | 反射/類載入器動態載入失敗 | 確認類在 classpath 中,注意類載入器層級 |
--module-path、-m module/class。javac -encoding UTF-8 ... 避免中文亂碼。javac -d out src/com/example/*.java 將 .class 輸出至 out 目錄,保持源碼整潔。