Classpath 是什麼?
告訴 JVM 去哪裡找類別檔 的路徑清單。類似 C/C++ 的 Include Path / Library Path,但針對 .class / .jar。
JVM 尋找類別邏輯
- Bootstrap Class Loader:
JAVA_HOME/jre/lib/rt.jar (核心 API:java.lang.String 等)
- Extension Class Loader:
JAVA_HOME/jre/lib/ext/*.jar
- System Class Loader:CLASSPATH 環境變數 或
java -cp 指定路徑
關鍵規則: 依順序掃描,**第一個找到的即載入,後續忽略**。
實例演示:版本衝突
# 兩個版本的 com.shinechina.MyClass
# 版本 1:c:\mylib\com\shinechina\MyClass.class (輸出 "版本 1")
# 版本 2:d:\mylib\com\shinechina\MyClass.class (輸出 "版本 2")
# CLASSPATH = c:\mylib;d:\mylib;...
java com.shinechina.MyClass
# 輸出:版本 1 (因 c:\mylib 在前)
# 強制使用版本 2
java -cp d:\mylib;%CLASSPATH% com.shinechina.MyClass
# 輸出:版本 2
IDE 配置 Classpath
| IDE | 配置路徑 |
| JBuilder | Project → Project Properties → Paths → Add Library / New Library |
| VisualAge for Java | 類別右鍵 → Properties → Classpath 標籤 → 編輯/全選 |
| Eclipse / IntelliJ IDEA | Project Structure → Modules → Dependencies (Maven/Gradle 自動管理,極少手動) |
| NetBeans | Project Properties → Libraries → Compile/Run |
注意: IDE 專案 Classpath 獨立於系統環境變數,這是「外面跑得動,IDE 跑不動」主因。
新手最易犯錯誤:Classpath 路徑寫錯層級
# 類別:com.shinechina.MyClass
# 編譯後:c:\mylib\com\shinechina\MyClass.class
# 錯誤寫法
CLASSPATH = c:\mylib\com\shinechina # 太深,JVM 找不到 package 根
CLASSPATH = c:\mylib\com # 太深
# 正確寫法
CLASSPATH = c:\mylib # 指向 package 根目錄 (com 的父目錄)
# 或
CLASSPATH = c:\mylib\ # 同前
鐵律: Classpath 必須指向 套件根目錄的父目錄,JVM 會自動依套件名展開子目錄尋找。
JAR 檔案 Classpath
# 必須寫到具體 .jar 檔案
CLASSPATH = c:\lib\utils.jar;c:\lib\driver.jar
# 不是目錄!
CLASSPATH = c:\lib\ # 錯誤:不會自動掃描目錄下所有 jar
最佳實踐總結
- 專案使用建構工具 (Maven/Gradle) → 自動管理依賴、傳遞依賴、版本衝突解決、Classpath 生成
- 避免設定系統 CLASSPATH → 汙染全域、專案間干擾、難以重現
- 啟動腳本明確指定 -cp → 版本可控、可審計、可重現
- 理解模組化 (JPMS/Jigsaw):Java 9+
module-path 取代 Classpath,強封裝、明確依賴
- 除錯利器:
java -verbose:class、JWhich、Arthas sc -d
總結
Classpath 是 Java 類別載入的「地圖」。核心認知三點:
- 順序決定勝負:第一個匹配生效
- 路徑指向包根父目錄:而非類別檔目錄、非 JAR 目錄
- 建構工具托管:拒絕手動維護
掌握這三點,Classpath 從「神秘黑盒」變成「可控地圖」。
- 上一篇文章: J2EE SDK 1.4 + Resin 2.1.16 安裝部署完整步驟
- 下一篇文章: Java IO/NIO 入門完整指南:流模型、裝飾者模式、NIO 通道與緩衝區
Copyright ©
程式碼之家 All Rights Reserved