安裝 JDK 核心只有兩件事:確定安裝目錄、正確配置環境變量。但「配置在哪個文件」、「sudo 後失效」、「圖形界面程序讀不到」等坑讓無數新手折騰。本文從原理分析到實操步驟,給出經過驗證的最佳實踐方案。
| 文件 | 作用範圍 | 生效時機 | 適合 JDK? |
|---|---|---|---|
/etc/environment | 全系統、與用戶無關 | 重啟 | ❌ 不支持變量擴展($VAR),且無法區分用戶 |
/etc/profile | 所有用戶登錄 Shell | 注銷重新登錄 | ✅ 系統級,但 sudo su 不讀取(非登錄 Shell) |
/etc/bash.bashrc | 所有用戶交互式 Bash | 打開新終端 | ✅ 覆蓋 sudo su、圖形啟動器調用的非登錄 Shell |
~/.bashrc | 當前用戶交互式 Bash | 打開新終端 | ❌ 單用戶,不適合多用戶共享服務器 |
/etc/profile:普通用戶登錄生效,但 sudo su 切換到 root 時不讀取(非登錄 Shell),導致 root 下 java -version 失效。/etc/bash.bashrc:sudo su、圖形終端會讀取,但 非 Shell 啟動的程序(如 Eclipse、IDE、systemd 服務)不會讀取,導致它們找不到 JDK。同時將 JDK 環境變量寫入 /etc/profile 和 /etc/bash.bashrc,覆蓋「登錄 Shell」與「非登錄交互式 Shell」兩大場景。對於 systemd 服務,建議在服務文件 Environment= 中顯式指定或使用 ExecStartPre source 腳本。
# 64 位系統下載 jdk-8u37-linux-x64.tar.gz(Oracle 官網需登錄,或用 OpenJDK)
# 此處示例用舊版 jdk-6u37,實際請用 LTS 版本
mv jdk-6u37-linux-x64.bin /opt/
cd /opt
chmod +x jdk-6u37-linux-x64.bin
./jdk-6u37-linux-x64.bin
# 解壓後目錄:/opt/jdk1.6.0_37
vim /etc/profile
# 文件末尾追加
# JDK 環境變量
export JAVA_HOME=/opt/jdk1.6.0_37
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
vim /etc/bash.bashrc
# 文件末尾追加(內容同 /etc/profile)
export JAVA_HOME=/opt/jdk1.6.0_37
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile
source /etc/bash.bashrc
# 普通用戶驗譹
java -version
javac -version
# sudo su 後驗證(關鍵測試)
sudo su -
java -version
# 圖形界面驗證:打開新終端或啟動 Eclipse/IDEA 檢查 JDK 識別
Ubuntu/Debian 系統建議用 update-alternatives 註冊 JDK,自動維護 /usr/bin/java 等符號鏈接,切換版本一條命令:
# 註冊(優先級 300)
update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_201/bin/java 300
update-alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_201/bin/javac 300
update-alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_201/bin/jar 300
# 切換版本
update-alternatives --config java
# 選擇序號即可
此法下 JAVA_HOME 仍建議在雙文件中顯式導出,或寫腳本 /etc/profile.d/jdk.sh 由 update-alternatives --config 觸發更新(需自行實現)。
. 開頭:表示當前目錄優先,避免類加載找不到當前目錄下的類。/etc/profile 需重新登錄;修改 /etc/bash.bashrc 只需開新終端。生產環境建議重啟驗證持久化。apt install openjdk-11-jdk 自動配置好路徑與 alternatives,省去手動麻煩,生產環境首選。結語: 雙文件同寫法解決 95% 場景下的 JDK 找不到問題;剩下 5%(systemd、cron、容器)請在啟動入口顯式聲明環境。養成「配置即文檔、驗證全場景」的習慣,才能一勞永逸。