核心區別一句話總結
PATH 是給作業系統找可執行程序的;CLASSPATH 是給 Java 編譯器/運行時找類文件的。
PATH 詳解
作用
- OS 在命令行輸入命令(如
javac、java、git)時,按順序搜索 PATH 目錄下的可執行文件
- 未配置時需輸入完整路徑:
C:\Java\jdk\bin\javac Hello.java
配置示例
# Windows (系統變量)
JAVA_HOME=C:\Program Files\Java\jdk-17
Path=%JAVA_HOME%\bin;%Path%
# Linux/macOS (~/.bashrc 或 /etc/profile)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
CLASSPATH 詳解
作用
- JVM 啟動時、
javac 編譯時,按順序搜索 CLASSPATH 下的 .class 文件或 .jar 包
- 格式:目錄路徑或 JAR 完整路徑,多路徑用分隔符分隔(Win `;` / Linux `:`)
- 關鍵點:
. 代表當前目錄,必須包含否則無法加載默認包類
配置示例
# Windows
CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
# Linux
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
對比總結表
| 維度 | PATH | CLASSPATH |
| 服務對象 | 作業系統 Shell | JVM / Java 編譯器 |
| 搜索目標 | 可執行文件 | 類文件 / JAR 包 |
| 典型內容 | JDK bin、工具鏈 bin | 項目輸出目錄、依賴 JAR、當前目錄 |
| 現代構建工具 | 仍需配置 | Maven/Gradle 自動構建,通常無需手動配置 |
| IDE 影響 | 終端運行受影響 | IDE 內部運行不受影響(自帶構建路徑) |
常見誤區與避坑
- 以為 CLASSPATH 必須配:Maven/Gradle 專案完全由構建工具管理依賴路徑,手動配置反而易衝突
- 把 JAR 放進 PATH:PATH 只識別可執行文件,JAR 無法直接執行
- 缺少
. 導致默認包類找不到:java Hello 報 NoClassDefFoundError
- 系統變量 vs 用戶變量:系統變量對所有用戶生效,用戶變量僅當前用戶,優先級:用戶 > 系統
- 路徑順序問題:同名命令/類按順序取第一個,JDK 版本衝突時調整順序
現代最佳實踐
- 僅配置 PATH:確保
java、javac、mvn、gradle 可全局調用
- 不配置 CLASSPATH:讓構建工具、IDE 管理類路徑
- 使用 SDKMAN/jEnv 管理多 JDK:動態切換 PATH 指向,項目級
.java-version 自動生效
- 容器化部署:Dockerfile 中
ENV PATH=/opt/java/bin:$PATH,無 CLASSPATH
驗證命令
# Windows
echo %PATH%
echo %CLASSPATH%
# Linux
echo $PATH
echo $CLASSPATH
# 測試 Java 可用性
java -version
javac -version
# 測試類加載
java -cp . Hello # 當前目錄必須在 cp 中