package a.b.c;
public class Hello { ... }
.../a/b/c/Hello.java.../a/b/c/Hello.classjava a.b.c.Hello (從 Classpath 根目錄下的 a/b/c/Hello.class 載入)違反此原則 → NoClassDefFoundError: wrong name。
-classpath / CLASSPATH 環境變數 (預設 . 當前目錄),-classpath 覆蓋環境變數,無疊加import 陳述式,解析包名包名/類名.java 或 .class.class 獨立載入,視為動態連結庫a/b/c/Hello),import 僅供編譯期解析,運行期不存在java a.b.c.Hello → 建立類路徑引用表 → 合成絕對路徑 classpath根/a/b/c/Hello.class → 讀取位元組碼 → 驗證內部類名匹配 → 定義類 → 初始化NoClassDefFoundError: wrong name| 陷阱 | 後果 | 對策 |
|---|---|---|
| 同名類存在於多個 Classpath 路徑 | 先找到者勝出,行為不可預期 | 明確 -classpath 順序,避免重複 |
| JAR 內包結構與目錄不符 | 載入失敗 | jar tf 檢查,jar cf 正確打包 |
| Default Package 類被同名包類遮蔽 | 難以除錯 | 嚴禁使用 Default Package |
| 環境變數 CLASSPATH 污染 | 影響所有 Java 程式 | 專案專用 -classpath 或 Manifest Class-Path |
# 編譯
javac -classpath d:\a.zip MyClass.java
# 執行
java -classpath d:\a.zip;. MyClass
. 代表當前目錄,必須顯式加入若需載入當前目錄類module-info.java 宣告 exports, requires--module-path 取代 -classpathjavac --module-source-path src -d out --module my.appJava Package/Import 機制核心在於 源碼/位元組碼目錄結構與包名完全對應。編譯期靠 -classpath 尋找定義,運行期靠類加載器按完全限定名定位。嚴守目錄結構、拒絕 Default Package、顯式管理 Classpath、拥抱模組化,是避免類加載地獄的鐵律。