Java 套件對應目錄階層,句點 . 代表路徑分隔符 /。例如 import doll.*; 會尋找 ./doll/ 目錄下所有 public 類別。
若透過 sudo apt-get install openjdk-11-jdk 安裝,系統 不會自動設定 CLASSPATH,導致 import 當前目錄下類別失敗。需手動編輯 ~/.bashrc:
/usr/lib/jvm/java-11-openjdk)# ~/.bashrc 末尾新增
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
關鍵點:CLASSPATH 必須包含 .(當前目錄),否則 import doll.*; 找不到本地套件。
修改後執行 source ~/.bashrc 或重新開啟終端機生效。
// 檔案:doll/Doll.java
package doll;
public class Doll {
private String name;
public Doll(String name) {
this.name = name;
}
public void speak() {
System.out.println(name);
}
}
// 檔案:App.java(置於 doll/ 目錄上層)
import doll.*;
public class App {
public static void main(String[] args) {
Doll doll = new Doll("Hello Doll");
doll.speak(); // 輸出:Hello Doll
}
}
# 目錄結構
.
├── App.java
└── doll
└── Doll.java
# 編譯(自動建立 doll/Doll.class)
javac App.java
# 執行
java App
| 錯誤現象 | 原因 | 解決方案 |
|---|---|---|
error: package doll does not exist | CLASSPATH 缺少 . 或目錄結構錯誤 | 檢查 CLASSPATH 含 .;確認 doll/ 在當前目錄 |
Error: Could not find or load main class App | 執行時未在 CLASSPATH 根目錄 | cd 到 App.class 所在目錄執行 java App |
class file has wrong version | JDK 版本不匹配(如用 JDK 17 編譯、JRE 11 執行) | 統一編譯/執行版本,或加 -source -target 參數 |
實務專案建議使用 Maven/Gradle 管理模組與依賴,避免手動維護 CLASSPATH。典型結構:
my-project/
├── pom.xml
├── core-module/
│ └── src/main/java/com/example/core/...
└── app-module/
└── src/main/java/com/example/app/App.java
Maven 自動處理編譯路徑、模組間依賴、測試編譯等,完全取代手動 javac/java 操作。