Java 開發環境搭建的第一道坎往往是環境變量配置。本文深度對比三種配置方式的作用域、生效時機、優先級與避坑細節,並提供標準化配置模板、驗證腳本與卸載指引,幫你一次配對、永久生效。
| 變量 | 作用 | 典型值示例 |
|---|---|---|
JAVA_HOME | JDK 安裝根目錄,Maven/Tomcat/IDE 搜尋基準 | /usr/lib/jvm/java-11-openjdk |
PATH | 命令搜索路徑,須包含 $JAVA_HOME/bin | $JAVA_HOME/bin:$PATH |
CLASSPATH | 類加載路徑,含當前目錄 . 與核心庫 | .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar |
| 維度 | /etc/profile (全局) | ~/.bash_profile (用戶級) | 终端临时 export |
|---|---|---|---|
| 生效範圍 | 所有用戶、所有 Shell | 當前用戶、登錄 Shell | 當前 Shell 進程及子進程 |
| 生效時機 | 用戶登錄時 | 用戶登錄時 | 立即生效 |
| 持久性 | 永久(重啟不變) | 永久(重啟不變) | 關閉終端失效 |
| 權限需求 | root | 普通用戶 | 普通用戶 |
| 推薦場景 | 開發服務器、CI/CD 構建節點 | 個人開發機、多版本共存 | 臨時測試、腳本內嵌 |
| 安全性 | 較低(全局污染) | 高(隔離) | 最高(無殘留) |
/etc/profile.d/java.sh(優於直接改 /etc/profile)# /etc/profile.d/java.sh
# 僅需 root 權限創建,無需修改系統核心文件,升級不覆蓋
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
chmod +x /etc/profile.d/java.sh
source /etc/profile.d/java.sh # 當前 Shell 立即生效
~/.bash_profile# ~/.bash_profile
# 若文件不存在可新建,注意前綴點號
export JAVA_HOME=/home/dev/jdk/jdk-17.0.8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
~/bin/use-java#!/bin/bash
# 用法: source use-java 11 / source use-java 17
VERSION=${1:-17}
case $VERSION in
11) export JAVA_HOME=/usr/lib/jvm/java-11-openjdk ;;
17) export JAVA_HOME=/usr/lib/jvm/java-17-openjdk ;;
21) export JAVA_HOME=/usr/lib/jvm/java-21-openjdk ;;
*) echo "Unsupported version: $VERSION"; return 1 ;;
esac
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
echo "Switched to Java $VERSION: $JAVA_HOME"
:,Windows 用分號 ;$PATH $CLASSPATH 必須保留,否則覆蓋系統路徑導致命令找不到. 不能丟:CLASSPATH 首位建議加 .,否則同目錄下類無法加載JAVA_HOME ≠ java_homeJAVA_HOME 指向實體目錄而非 /usr/bin/java 鏈接tools.jar 已移除,CLASSPATH 可簡化為 .:$JAVA_HOME/lib/*#!/bin/bash
# check-java-env.sh
echo "=== Java Environment Check ==="
echo "JAVA_HOME = ${JAVA_HOME:-未設置}"
echo "PATH = $PATH"
echo "CLASSPATH = ${CLASSPATH:-未設置}"
echo ""
if [[ -n "$JAVA_HOME" && -x "$JAVA_HOME/bin/java" ]]; then
echo "✅ java -version:"
"$JAVA_HOME/bin/java" -version 2>&1 | head -3
echo ""
echo "✅ javac -version:"
"$JAVA_HOME/bin/javac" -version 2>&1
else
echo "❌ JAVA_HOME 無效或 java 不可執行"
exit 1
fi
# 編譯運行測試
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 && "$JAVA_HOME/bin/javac" Test.java && "$JAVA_HOME/bin/java" Test
rm -f /tmp/Test.java /tmp/Test.class
# RPM 安裝
rpm -e $(rpm -qa | grep -i jdk)
# 解壓安裝
rm -rf /usr/lib/jvm/java-17-openjdk # 對應 JAVA_HOME
rm -f /etc/profile.d/java.sh
rm -f /usr/bin/java /usr/bin/javac /usr/bin/jar # 如有手動建立的軟鏈接
# 清理 alternatives(如使用 update-alternatives)
update-alternatives --remove-all java
update-alternatives --remove-all javac
現代最佳實踐: 生產環境推薦 方案 A(/etc/profile.d/) + 方案 C(版本切換腳本) 組合。容器化部署時,直接在 Dockerfile 中
ENV JAVA_HOME=...最乾淨。