正確配置 `JAVA_HOME`、`PATH`、`CLASSPATH` 是 Java 開發環境搭建的第一步,也是排查「`java` 不是內部命令」、「版本不一致」、「類找不到」等問題的基石。本文提供 **Linux (永久/臨時)、macOS (Intel/Apple Silicon)、Windows 10/11** 三大平台的標準化配置流程、驗證腳本、多版本切換方案及常見錯誤避坑。
| 變量名 | 作用 | 典型值示例 | 是否必須 |
|---|---|---|---|
| JAVA_HOME | JDK 安裝根目錄 (含 bin, lib, include) | /usr/lib/jvm/java-17-openjdk / C:\Program Files\Java\jdk-17 | 必須 (IDE、Maven、Gradle、Tomcat 依賴) |
| PATH | 命令搜索路徑,需包含 %JAVA_HOME%\bin (Win) 或 $JAVA_HOME/bin (Unix) | ...:/usr/lib/jvm/java-17-openjdk/bin ... / C:\Program Files\Java\jdk-17\bin | 必須 (運行 java/javac/jar 等命令) |
| CLASSPATH | 類搜索路徑 (現代構建工具/IDE 通常不依賴,可不設置或僅保留 .) | .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar / .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar | 可選 (避免設置錯誤導致類衝突) |
優勢:不修改系統核心文件、包管理器升級不覆蓋、所有用戶生效、易管理。
# 下載 (或使用包管理器: apt install openjdk-17-jdk / yum install java-17-openjdk-devel)
wget https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_linux-x64_bin.tar.gz
tar -xzf openjdk-17.0.2_linux-x64_bin.tar.gz
sudo mv jdk-17.0.2 /usr/lib/jvm/ # 統一管理目錄
sudo tee /etc/profile.d/java.sh > /dev/null <<'EOF'
# Java 環境變量
export JAVA_HOME=/usr/lib/jvm/jdk-17.0.2
export PATH=$JAVA_HOME/bin:$PATH
# export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar # 現代項目一般不需要
EOF
sudo chmod +x /etc/profile.d/java.sh
source /etc/profile.d/java.sh # 當前終端生效
# 註冊多個 JDK
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-17.0.2/bin/java 1700
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk-17.0.2/bin/javac 1700
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-11.0.20/bin/java 1100
# 交互式切換
sudo update-alternatives --config java
sudo update-alternatives --config javac
# JAVA_HOME 動態獲取 (加入 /etc/profile.d/java.sh)
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:/bin/java::")
java -version
javac -version
echo $JAVA_HOME
| 方式 | 優點 | 缺點 | JAVA_HOME 典型路徑 |
|---|---|---|---|
| Homebrew (推薦) | 版本管理、易升級、自動配置 PATH | 需安裝 Homebrew | /opt/homebrew/Cellar/openjdk/17/libexec (M系列) / /usr/local/Cellar/... (Intel) |
| SDKMAN! | 多版本切換極致優雅、跨平台 | 需 curl 安裝 | $HOME/.sdkman/candidates/java/17.0.2-tem |
| 官網 .dmg 安裝 | 圖形化、系統級註冊 | 版本切換麻煩、污染 /Library/Java/JavaVirtualMachines | /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home |
# 1. 安裝
brew install openjdk@17 # 或 openjdk (最新 LTS)
# 2. 配置環境變量 (Apple Silicon M系列路徑不同)
# 檢查實際安裝路徑
ls /opt/homebrew/Cellar/openjdk@17/ # M系列
# ls /usr/local/Cellar/openjdk@17/ # Intel
# 3. 寫入 ~/.zprofile (登錄 Shell 載入) 或 ~/.zshrc (交互式 Shell)
cat >> ~/.zprofile <<'EOF'
# Homebrew OpenJDK 17
export JAVA_HOME="/opt/homebrew/opt/openjdk@17/libexec"
export PATH="$JAVA_HOME/bin:$PATH"
# 讓系統 Java 命令可用 (可選,創建符號鏈接)
# sudo ln -sfn $JAVA_HOME/bin/java /usr/local/bin/java
EOF
source ~/.zprofile
# 1. 安裝
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
# 2. 列出可用版本並安裝
sdk list java
sdk install java 17.0.2-tem # Temurin (Adoptium) 建議
sdk install java 21.0.2-tem
# 3. 切換版本 (當前終端 / 全局 / 項目級 .sdkmanrc)
sdk use java 21.0.2-tem # 臨時
sdk default java 17.0.2-tem # 全局默認
echo "java=17.0.2-tem" > .sdkmanrc # 項目目錄自動切換 (進入目錄觸發)
# 4. JAVA_HOME 自動管理,無需手動配置
echo $JAVA_HOME # 自動指向當前版本
java -version
javac -version
/usr/libexec/java_home -V # 列出系統檢測到的所有 JDK
> java -version
> javac -version
> echo %JAVA_HOME%
> where java # 確認調用的是哪個 java.exe
$javaHome = "C:\Java\jdk-17"
[Environment]::SetEnvironmentVariable("JAVA_HOME", $javaHome, "Machine")
$path = [Environment]::GetEnvironmentVariable("Path", "Machine")
if (-not $path.Split(';').Contains("%JAVA_HOME%\bin")) {
$newPath = "%JAVA_HOME%\bin;" + $path
[Environment]::SetEnvironmentVariable("Path", $newPath, "Machine")
}
# 需管理員權限運行,新開終端生效
保存為 `check-java-env.sh` (Linux/macOS) 或 `check-java-env.bat` (Windows):
#!/bin/bash
# check-java-env.sh
echo "=== Java 環境檢查 ==="
echo "JAVA_HOME: $JAVA_HOME"
echo "PATH 包含 java: $(which java)"
java -version 2>&1 | head -1
javac -version 2>&1 | head -1
echo "--- 測試編譯運行 ---"
cat > /tmp/Test.java <<'EOF'
public class Test { public static void main(String[] args) { System.out.println("Java Env OK: " + System.getProperty("java.version")); } }
EOF
cd /tmp && javac Test.java && java Test && rm Test.java Test.class
:: check-java-env.bat
@echo off
echo === Java 環境檢查 ===
echo JAVA_HOME: %JAVA_HOME%
where java
java -version
javac -version
echo --- 測試編譯運行 ---
echo public class Test { public static void main(String[] args) { System.out.println("Java Env OK: " + System.getProperty("java.version")); } } > %TEMP%\Test.java
cd /d %TEMP% && javac Test.java && java Test && del Test.java Test.class
Java 環境變量配置的核心是:**JAVA_HOME 指向 JDK 根目錄、PATH 優先包含 $JAVA_HOME/bin、不設置全局 CLASSPATH**。Linux 推薦 `/etc/profile.d/` + `update-alternatives`;macOS 首選 **SDKMAN!** 管理多版本,次選 Homebrew;Windows 圖形化設置系統變量並驗證 `where java`。統一使用驗證腳本確保環境一致性,項目級版本鎖定避免「在我機器上能跑」的協作陷阱。