Classpath 定義
classpath (類路徑) 告訴 JVM **類載入器** 去哪裡尋找 .class 檔案與 JAR 封裝檔。它是 JVM 啟動時的核心參數之一。
作用機制
- 未設定時:預設為當前目錄
.
- 編譯時 (
javac):尋找引用的類別定義
- 執行時 (
java):尋找應用程式入口類與所有相依類別
- 搜尋順序:按路徑順序從左到右,找到第一個匹配即停止
設定方式
1. 命令列參數 (最高優先權)
javac -cp ".;lib\*;classes" MyClass.java
java -cp ".;lib\*;classes" com.example.MyClass
2. 環境變數 CLASSPATH
- Windows:
set CLASSPATH=.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar
- Linux/macOS:
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
- 缺點:全域影響、專案間相互干擾,**不推薦**用於專案開發
3. Manifest 中的 Class-Path (JAR 部署標準)
MANIFEST.MF
Manifest-Version: 1.0
Main-Class: com.example.Main
Class-Path: lib/dependency1.jar lib/dependency2.jar
執行 java -jar app.jar 時自動解析相對路徑。
路徑組成規則
| 類型 | 格式範例 | 說明 |
| 目錄 | classes, /opt/app/classes | 以套件結構為根目錄 |
| JAR 檔 | lib/util.jar, C:\app\lib\core.jar | **必須包含檔名**,非目錄 |
| 通配符 | lib\* (Java 6+) | 匹配目錄下所有 JAR,不遞迴子目錄 |
常見問題
| 現象 | 原因 | 解決 |
ClassNotFoundException | 類別不在 classpath 中 | 檢查路徑拼寫、JAR 是否存在、套件結構是否正確 |
NoClassDefFoundError | 編譯時存在、執行時缺失 | 檢查相依傳遞、靜態初始化失敗 |
| 版本衝突 | 同類別多版本存在 | 調整 classpath 順序、排除舊版、使用模組系統 (JPMS) |
IDE 中的 Classpath
- Eclipse:專案右鍵 → Properties → Java Build Path → Libraries / Source 頁籤
- IntelliJ IDEA:File → Project Structure → Modules → Dependencies
- Maven/Gradle:透過
pom.xml/build.gradle 宣告相依,IDE 自動同步 classpath
最佳實務
- 勿依賴環境變數 CLASSPATH,改用建構工具 (Maven/Gradle) 或啟動腳本指定
-cp
- JAR 部署使用
Manifest Class-Path 管理相依
- 模組化專案 (Java 9+) 遷移至 JPMS (
module-info.java),取代傳統 classpath
- 生產環境啟動腳本明確列出所有 JAR,避免通配符帶來的不確定性
總結
Classpath 是 JVM 類別搜尋的路徑地圖。理解其**搜尋順序、路徑格式 (目錄 vs JAR)、設定優先權 (命令列 > Manifest > 環境變數)** 及**建構工具整合方式**,是 Java 開發與部署的核心基本功。
- 上一篇文章: XMLHttpRequest 與 Ajax 重塑 Web 開發:機遇、風險與安全防禦深度分析
- 下一篇文章: Java for 迴圈演進:傳統寫法、增強型 for-each 與最佳實務
Copyright ©
程式碼之家 All Rights Reserved