在 Linux 開發環境中,正確設定環境變數(如 JAVA_HOME、PATH、CLASSPATH)是專案順利編譯執行的前提。本文詳細比較三種配置方法的適用場景、優缺點、寫法差異與常見錯誤,以 JDK 設定為實例演示。
| 方法 | 生效範圍 | 生效時間 | 適用場景 | 安全性 |
|---|---|---|---|---|
| /etc/profile | 所有使用者 | 登入 Shell | 系統級開發環境、伺服器統一配置 | 低(影響所有帳號) |
| ~/.bashrc | 單一使用者 | 互動式 Shell 啟動 | 個人開發環境、多版本切換 | 高(使用者隔離) |
| 命令列 export | 當前 Shell 進程 | 立即生效 | 臨時測試、腳本內部、CI/CD 階段 | 最高(進程隔離) |
sudo vim /etc/profile
在檔案末尾新增:
export JAVA_HOME=/usr/share/jdk1.5.0_05
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
生效: source /etc/profile 或重新登入。
vim ~/.bashrc
在檔案末尾新增:
export JAVA_HOME=/usr/share/jdk1.5.0_05
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
注意: 原文使用 set 錯誤,Bash 應使用 export 或直接 VAR=value(區域變數),export 才能導出給子進程。
生效: source ~/.bashrc 或開新終端機。
export JAVA_HOME=/usr/share/jdk1.5.0_05
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
關閉終端機即失效,適合臨時測試不同 JDK 版本。
:(Windows 用分號 ;)PATH=$JAVA_HOME/bin:$PATH 而非 PATH=$JAVA_HOME/bin,否則系統指令(ls、grep)將找不到. 代表當前目錄,否則 java MyClass 會找不到類別JAVA_HOME ≠ java_home$VAR 或 ${VAR},避免硬編碼路徑echo $JAVA_HOME
echo $PATH
java -version
javac -version
# ~/.bashrc 末尾定義函數
use_jdk8() { export JAVA_HOME=/usr/lib/jvm/java-8-openjdk; export PATH=$JAVA_HOME/bin:$PATH; }
use_jdk11() { export JAVA_HOME=/usr/lib/jvm/java-11-openjdk; export PATH=$JAVA_HOME/bin:$PATH; }
use_jdk17() { export JAVA_HOME=/usr/lib/jvm/java-17-openjdk; export PATH=$JAVA_HOME/bin:$PATH; }
終端機輸入 use_jdk11 即可瞬間切換版本。
~/.bashrc,安全且靈活/etc/profile 或 Dockerfile ENV,確保服務帳號一致export,不汙染環境正確管理環境變數,能避免 90% 的「找不到指令/類別/庫」經典錯誤,是 Linux 開發者的必修內功。