三大環境變數角色速覽
| 變數名 | 核心用途 | 典型值範例 | 影響對象 |
| JAVA_HOME | JDK 安裝根目錄基準路徑,供其他變數引用、第三方工具探測 | C:\Program Files\Java\jdk-11 | Maven, Gradle, Ant, Tomcat, IDE, CI/CD |
| PATH | 作業系統尋找可執行檔 (java, javac, jar...) 的目錄清單 | %JAVA_HOME%\bin (Win)
$JAVA_HOME/bin (Linux) | 命令列、腳本、所有進程 |
| CLASSPATH | JVM 類載入器尋找 .class、.jar 檔案的路徑清單 | .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar | java、javac、JVM 類載入器 |
為什麼需要分三個變數?歷史與設計考量
- 關注點分離:安裝路徑 (JAVA_HOME) ≠ 執行檔搜尋 (PATH) ≻ 類搜尋 (CLASSPATH)
- 避免硬編碼:第三方工具讀
JAVA_HOME 自動定位 bin, lib, include,升級 JDK 只改一處
- 相容舊版規範:早期 JDK 1.0/1.1 要求手動設 CLASSPATH;現代模組化系統 (JDK 9+) 已弱化 CLASSPATH 角色
- 隔離執行與編譯:PATH 決定
java 執行哪個版本;CLASSPATH 決定 javac 編譯時引用哪些庫
Windows 設定完整步驟 (圖文並茂版)
1. 確認 JDK 安裝路徑
預設:C:\Program Files\Java\jdk-11.0.20 (無空格路徑較佳,建議自訂 D:\Java\jdk-11)
2. 開啟環境變數視窗
- Win+R →
sysdm.cpl → 進階 → 環境變數
- 或:Win 搜尋「編輯系統環境變數」
3. 新增/修改 系統變數
| 變數名 | 變數值 | 說明 |
| JAVA_HOME | D:\Java\jdk-11 | 指向 JDK 根目錄 (含 bin, lib, include),非 JRE 目錄 |
| PATH | %JAVA_HOME%\bin (置頂) | 編輯現有 PATH,將 %JAVA_HOME%\bin 移至最前,確保優先使用此 JDK |
| CLASSPATH | .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar | 前綴 . 代表當前目錄;JDK 9+ 可省略 dt.jar/tools.jar (模組化) |
4. 驗證設定
cmd /k "echo JAVA_HOME=%JAVA_HOME% & echo PATH=%PATH% & echo CLASSPATH=%CLASSPATH% & java -version & javac -version & java -cp . HelloWorld"
Linux/macOS 設定 (永久生效)
單用戶 ~/.bashrc / ~/.zshrc
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 套用
source ~/.bashrc
全域 /etc/profile.d/java.sh (需 root)
#!/bin/bash
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
現代 Java (JDK 9+) 環境變數新觀念
- 模組系統:
--module-path / -p 取代部分 CLASSPATH 功能
- jlink 精簡運行時:打包後的應用內含 JVM,無需外部 JAVA_HOME
- 工具鏈支援:Maven/Gradle 透過 Toolchains 自動探測 JDK,減少環境變數依賴
- CLASSPATH 建議:僅保留
. 即可,專案依賴交給建構工具管理
常見錯誤與排查
| 錯誤現象 | 原因 | 修正 |
'java' 不是內部或外部命令 | PATH 缺少 %JAVA_HOME%\bin | 編輯 PATH,新增並置頂 |
Error: JAVA_HOME is not defined | Maven/Tomcat 讀不到 JAVA_HOME | 設定系統變數 JAVA_HOME,重開終端 |
NoClassDefFoundError | CLASSPATH 缺少依賴 jar 路徑 | 專案用 Maven/Gradle 管理依賴,勿手動堆 CLASSPATH |
版本不一致:java -version ≠ javac -version | PATH 指向 JRE,JAVA_HOME 指向 JDK | PATH 指向 %JAVA_HOME%\bin,確保同源 |
| 路徑含空格導致腳本失敗 | C:\Program Files\Java\... | 重裝 JDK 至無空格路徑 (如 D:\Java\jdk-11) |
最佳實踐總結
- 只設 JAVA_HOME 指向 JDK,PATH 追加
%JAVA_HOME%\bin,CLASSPATH 僅保留 .
- 避免空格路徑,統一團隊安裝目錄慣例 (如
/opt/java/jdk-11, D:\Java\jdk-11)
- 專案依賴交給建構工具 (Maven/Gradle),不要把大量 jar 路徑塞進 CLASSPATH
- CI/CD 環境:使用 Toolchains 或容器映像鎖定 JDK 版本,不依賴主機環境變數
- 定期檢視:
java -XshowSettings:properties -version 2>&1 | grep java.home 驗證實際生效路徑
結語
JAVA_HOME、PATH、CLASSPATH 三者分工明確:基準路徑、命令搜尋、類搜尋。現代開發中,建構工具與模組系統已大幅弱化 CLASSPATH 角色,核心只需「JAVA_HOME 指向正確 JDK,PATH 包含其 bin 目錄」。理解三者關係,能快速定位環境配置問題,避免「在我機器上能跑」的協作陷阱。