境變量配置實(shí)戰(zhàn))
還在給 CentOS 7 裝 JDK 7u25 的人多半不是圖新鮮而是被老項(xiàng)目拴住了再有就是部署腳本里寫死了 jdk-7u25-linux-x64.tar.gz 這個(gè)文件名。我自己這兩年幫人搭過好幾套這樣的環(huán)境原因都差不多某個(gè)老中間件版本鎖定、編譯環(huán)境必須對(duì)齊、或者應(yīng)用代碼只能在 Java 7 上跑。這篇文章把從下載校驗(yàn)、解壓部署到環(huán)境變量配置、生效驗(yàn)證、常見坑位排查的完整流程走一遍全部是實(shí)際操作里的經(jīng)驗(yàn)。適合剛接手老系統(tǒng)、需要在 CentOS 7 上離線部署指定 JDK 版本的運(yùn)維和開發(fā)同學(xué)參考照著抄基本不會(huì)出大問題。1. 安裝前的環(huán)境檢查與下載準(zhǔn)備很多人一拿到安裝包就急著解壓結(jié)果權(quán)限、位數(shù)、系統(tǒng)自帶 JDK 一堆事全堆到后面才暴露。我建議先花五分鐘把準(zhǔn)備工作做扎實(shí)后面每一步都順。1.1 為什么要指定 JDK 7u25JDK 7u25 是 2013 年前后的版本論新鮮程度當(dāng)然完全談不上但老系統(tǒng)的世界有自己的規(guī)則。我接過好幾個(gè)項(xiàng)目代碼本身沒多復(fù)雜問題全出在依賴鏈一個(gè)老中間件只認(rèn) Java 7或者某個(gè)第三方庫在后續(xù)小版本里改了行為一旦升級(jí)到 u40、u51 之后反而出詭異報(bào)錯(cuò)。還有一種是外包方交付時(shí)直接寫了jdk-7u25-linux-x64.tar.gz這個(gè)文件名后續(xù)維護(hù)者自然照單全收。所以這里先明確一點(diǎn)如果你不是被版本鎖死我不會(huì)推薦你裝 7u25。CentOS 7 上合理的選擇通常是 JDK 8甚至系統(tǒng)自帶的 OpenJDK。只有在部署腳本、中間件、代碼三方都指向這個(gè)具體版本時(shí)才需要走完整離線安裝流程。這也是下面所有步驟的前提——搞清楚為什么裝比怎么裝更重要。1.2 確認(rèn)系統(tǒng)位數(shù)和現(xiàn)有 Java 環(huán)境CentOS 7 基本都跑在 x86_64 架構(gòu)上但生產(chǎn)環(huán)境里偶爾也會(huì)碰到 32 位的小機(jī)器尤其是一些嵌入式、老舊虛擬機(jī)。位數(shù)搞錯(cuò)了后面編譯出來的程序跑不起來事小解壓時(shí)報(bào)錯(cuò)才讓人摸不著頭腦。先看系統(tǒng)信息和架構(gòu)cat /etc/centos-release uname -m結(jié)果里出現(xiàn)x86_64就選jdk-7u25-linux-x64.tar.gz。如果出現(xiàn)的是i686或i386就得找jdk-7u25-linux-i586.tar.gz。這一點(diǎn)必須開頭就確認(rèn)我見過有人把 64 位包裝到 32 位系統(tǒng)上java -version直接提示無法執(zhí)行二進(jìn)制文件排查了半天才發(fā)現(xiàn)是包選錯(cuò)。接著看當(dāng)前系統(tǒng)已經(jīng)有啥which java java -version rpm -qa | grep -i jdkCentOS 7 的很多安裝模板會(huì)自帶 OpenJDK很多人就是被這個(gè)默認(rèn)存在的版本帶偏了。注意這里不是讓你立刻卸載只是先記錄現(xiàn)狀。最后選用的 Java 版本以誰的路徑排在前面為準(zhǔn)這個(gè)邏輯在排查章節(jié)會(huì)詳細(xì)講。1.3 安裝包獲取與完整性校驗(yàn)JDK 7 這類老版本在官方站點(diǎn)通常歸入歷史歸檔區(qū)域下載一般需要登錄賬號(hào)。如果你走內(nèi)網(wǎng)離線環(huán)境那多半是從公司內(nèi)部源服務(wù)器或者某個(gè)共享目錄拷過來。無論哪種來源到手后先做一件事校驗(yàn)完整性。md5sum jdk-7u25-linux-x64.tar.gz sha256sum jdk-7u25-linux-x64.tar.gz比對(duì)官方公布的值或者哪怕只是和提供方的發(fā)布說明對(duì)一下。這一步很多人嫌麻煩直接跳過但安裝包損壞在解壓階段通常會(huì)報(bào)出gzip: invalid compressed data或unexpected EOF這類錯(cuò)誤到時(shí)候你還要回頭重新下載反而更費(fèi)時(shí)。校驗(yàn)通過后把文件放到一個(gè)固定位置我習(xí)慣用/opt/downloads也可以用/usr/local/src看你自己的目錄習(xí)慣。再順手確認(rèn)一下目標(biāo)分區(qū)的可用空間df -h /usr/localJDK 7 解壓后大概一兩百兆空間上基本不會(huì)卡但服務(wù)器常年在跑、分區(qū)整理過的人應(yīng)該懂這塊檢查只要十秒鐘有備無患。2. 為什么選 tar.gz 解壓方式而不是 yum 或 rpm標(biāo)題既然叫解壓配置環(huán)境變量那核心方案就是繞開包管理器直接用二進(jìn)制分發(fā)版。這里我把幾種方式放到一起對(duì)比一下你就明白為什么這條路線在老系統(tǒng)場(chǎng)景里最可控。2.1 三種安裝方式的取舍如果你只想要一個(gè)能用的 Javayum install java-1.7.0-openjdk一行命令就解決了但那是 OpenJDK 構(gòu)建版?,F(xiàn)實(shí)問題是某些老中間件的驗(yàn)證邏輯偏偏對(duì)java -version輸出里的商標(biāo)字符串敏感或者某些加密、序列化行為在 OpenJDK 和商業(yè)發(fā)行版之間存在細(xì)微差異。這種場(chǎng)景下官方提供的 tar.gz 二進(jìn)制包是最原汁原味的選擇。rpm 方式也屬于官方發(fā)行渠道裝上之后會(huì)落到/usr/java目錄并且自動(dòng)接入系統(tǒng)alternatives機(jī)制。好處是標(biāo)準(zhǔn)、可卸載壞處是它會(huì)對(duì)系統(tǒng)級(jí)java命令做接管如果機(jī)器上本來就有一堆軟件依賴舊版本rpm 一裝可能會(huì)把它們影響的軟件都牽扯進(jìn)來。等你以后想切版本還要和alternatives打交道多一層復(fù)雜度。tar.gz 解壓方式最直接不寫 rpm 數(shù)據(jù)庫、不動(dòng)alternatives、不污染系統(tǒng)默認(rèn)命令就是把文件放到你指定的目錄然后自己控制環(huán)境變量。對(duì)于主版本必須精確、多版本可能并存、隨時(shí)能回滾的老系統(tǒng)運(yùn)維場(chǎng)景這是最可控的方案。你可以手動(dòng)指定誰在前誰在后哪怕機(jī)器上有三四個(gè) JDK 也不打架。2.2 安裝目錄規(guī)劃與版本共存解壓安裝最大的自由就是目錄自己定但自由不等于亂放。我見過有人解壓到/root、/home/xxx甚至/tmp下面的當(dāng)時(shí)能用一重啟或者目錄被別人清了就全完。規(guī)規(guī)矩矩放在/usr/local/java下面是我比較推薦的做法。規(guī)劃起來也很簡(jiǎn)單/usr/local/java/jdk1.7.0_25因?yàn)?JDK 7 的 tar.gz 包解壓出來自帶頂層目錄jdk1.7.0_25所以你只要在/usr/local/java下解壓它就會(huì)自己形成獨(dú)立目錄。將來如果需要 JDK 8再解壓一個(gè)到旁邊形成/usr/local/java/jdk1.7.0_25 /usr/local/java/jdk1.8.0_xxx環(huán)境變量想切哪個(gè)就指向哪個(gè)目錄互不干擾刪除其中一個(gè)版本也只是刪目錄而已不會(huì)影響另一個(gè)。個(gè)人建議如果你有長(zhǎng)期維護(hù)打算再做一個(gè)軟鏈接ln -s /usr/local/java/jdk1.7.0_25 /usr/local/java/current然后環(huán)境變量統(tǒng)一指向current以后切版本只改軟鏈接不需要再改一堆腳本。這個(gè)是經(jīng)驗(yàn)之談老系統(tǒng)里腳本寫死路徑的痛誰踩誰知道。2.3 JAVA_HOME 到底解決什么問題很多新手有個(gè)疑問PATH里明明已經(jīng)加了$JAVA_HOME/bin為什么還要單獨(dú)設(shè)一個(gè)JAVA_HOME兩條變量的分工其實(shí)很明確。PATH是給命令解析用的。你在終端輸入java -version系統(tǒng)就是按PATH列出的目錄依次找java可執(zhí)行文件找到就執(zhí)行。所以PATH管的是命令行誰先被命中。JAVA_HOME是給應(yīng)用和構(gòu)建工具用的。老規(guī)矩里像 Tomcat、Maven、Gradle 這類程序并不是靠猜PATH里有沒有 java而是去讀JAVA_HOME這個(gè)環(huán)境變量來決定整套 JDK 的根路徑在哪。如果這個(gè)變量不設(shè)很多中間件的啟動(dòng)腳本會(huì)報(bào)JAVA_HOME is not defined correctly哪怕你命令行里java -version完全正常。所以正規(guī)做法永遠(yuǎn)是兩個(gè)都配JAVA_HOME指明根目錄PATH把$JAVA_HOME/bin放到最前面。這樣命令行層面和工具層面都能定位到同一個(gè) JDK不會(huì)出現(xiàn)命令行是 1.7Tomcat 里卻跑著 1.8這種精神分裂現(xiàn)場(chǎng)。3. 詳細(xì)實(shí)操解壓、配置環(huán)境變量與生效驗(yàn)證開始動(dòng)手前再說一次以下操作默認(rèn)你用的是 root 賬號(hào)或者有sudo權(quán)限。老系統(tǒng)環(huán)境里權(quán)限混亂是最常見的隱患盡量整個(gè)過程一個(gè)身份走完。3.1 解壓并部署到目標(biāo)目錄先說目錄準(zhǔn)備我習(xí)慣先把目標(biāo)目錄建好mkdir -p /usr/local/java然后執(zhí)行解壓tar -zxvf /opt/downloads/jdk-7u25-linux-x64.tar.gz -C /usr/local/java參數(shù)說明一下-z表示解壓 gzip 壓縮格式-x是展開-v把解壓過程列出來方便確認(rèn)-f指定文件。-C指定目標(biāo)目錄這個(gè)參數(shù)省不了不然它會(huì)原地解壓到當(dāng)前目錄。解壓完成之后務(wù)必看一眼結(jié)果ls -l /usr/local/java/正常情況下你會(huì)看到j(luò)dk1.7.0_25這個(gè)目錄。順便確認(rèn)目錄里的關(guān)鍵文件權(quán)限沒有問題ls -l /usr/local/java/jdk1.7.0_25/bin/java ls -l /usr/local/java/jdk1.7.0_25/bin/javac這兩個(gè)文件必須帶x執(zhí)行權(quán)限。從官方 tar.gz 解壓出來的通常沒問題但如果你是從某個(gè)內(nèi)部渠道轉(zhuǎn)存過來的包偶爾會(huì)遇到權(quán)限被抹掉的情況沒有執(zhí)行權(quán)限直接表現(xiàn)為java 命令存在但執(zhí)行報(bào) Permission denied后面排查章節(jié)會(huì)再提。3.2 寫入環(huán)境變量配置這是全流程里最核心的一步。傳統(tǒng)做法是編輯/etc/profile因?yàn)樗鼘?duì)所有登錄用戶生效符合系統(tǒng)級(jí) JDK的定位。動(dòng)系統(tǒng)文件前先備份這是老運(yùn)維的本能操作cp /etc/profile /etc/profile.bak.$(date %Y%m%d)然后打開/etc/profile追加以下內(nèi)容export JAVA_HOME/usr/local/java/jdk1.7.0_25 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar每行都要解釋清楚。JAVA_HOME就是整個(gè)安裝包的絕對(duì)路徑PATH這里把$JAVA_HOME/bin放在最前面就是要確保你的java、javac能壓過系統(tǒng)里其他版本先被命中CLASSPATH是類搜索路徑經(jīng)典配置里有個(gè)開頭的.代表當(dāng)前目錄配合老式j(luò)avac、java手動(dòng)編譯運(yùn)行的習(xí)慣不過這部分在現(xiàn)代工程里其實(shí)越來越雞肋。說到CLASSPATH我要多說一句現(xiàn)在的 Java 項(xiàng)目基本都是靠 Maven、Gradle 管理依賴命令行編譯也一般不用類路徑這東西。但對(duì)老系統(tǒng)場(chǎng)景尤其是一些教程、腳本里寫死的編譯命令它仍然是剛需。如果你的環(huán)境完全不需要dt.jar和tools.jar那這行可以不寫不影響 Java 本身運(yùn)行。這是我踩過幾次坑之后的體會(huì)——要么別寫要么寫了就確保路徑對(duì)否則ClassNotFoundException比想象中更常見。如果你不想改動(dòng)整個(gè)/etc/profile還有一個(gè)更干凈的做法新建一個(gè)獨(dú)立配置文件cat /etc/profile.d/java.sh EOF export JAVA_HOME/usr/local/java/jdk1.7.0_25 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar EOF/etc/profile在登錄時(shí)本來就會(huì)加載/etc/profile.d下所有.sh文件所以效果一致但好處是把 Java 配置從系統(tǒng)主文件里拆出來將來卸載或切換時(shí)只需要處理一個(gè)文件干凈清爽。我在自己維護(hù)的機(jī)器上基本都走這條路。3.3 讓配置立刻生效并核對(duì)環(huán)境變量改完不會(huì)自己生效當(dāng)前已打開的終端需要手動(dòng)加載一次source /etc/profile如果走的是/etc/profile.d/java.sh方案同樣執(zhí)行source /etc/profile它會(huì)連帶加載那個(gè)文件。這里有個(gè)易錯(cuò)點(diǎn)source只對(duì)當(dāng)前終端會(huì)話生效。你新開的 SSH 連接、別的登錄用戶都會(huì)在登錄時(shí)自動(dòng)再讀一遍配置不用重復(fù) source但是已經(jīng)打開的終端窗口不會(huì)自動(dòng)感知。所以當(dāng)你發(fā)現(xiàn)某個(gè)終端里java還是舊版本時(shí)先別懷疑配置寫錯(cuò)很可能只是那個(gè)終端沒重新加載。生效后按順序驗(yàn)證echo $JAVA_HOME echo $PATH which java java -version javac -versionecho $JAVA_HOME應(yīng)該輸出/usr/local/java/jdk1.7.0_25which java應(yīng)該指向/usr/local/java/jdk1.7.0_25/bin/javajava -version里能看到1.7.0_25和64-Bit字樣javac -version則是javac 1.7.0_25。這套組合驗(yàn)證基本能確認(rèn)安裝和配置都正確。3.4 用最小程序做一次真實(shí)編譯運(yùn)行環(huán)境變量看著沒問題還得來一次真實(shí)的編譯運(yùn)行因?yàn)閖ava和javac是兩條獨(dú)立的鏈路一個(gè)通了不代表另一個(gè)通。我在一個(gè)干凈目錄里寫下最簡(jiǎn)單的驗(yàn)證代碼public class Hello { public static void main(String[] args) { System.out.println(Hello, JDK 7); } }然后javac Hello.java java Hello能打印出Hello, JDK 7就說明從編譯到運(yùn)行的完整鏈路都通了。建議你在家目錄之外換個(gè)目錄再跑一遍這樣可以確認(rèn)不是靠當(dāng)前目錄里的巧合而是PATH和CLASSPATH真正起作用了。這一步很多人忽略但它是判斷配置是否真正全局生效的試金石。4. 常見問題排查與避坑記錄這一段是我實(shí)際維護(hù)老系統(tǒng)時(shí)反復(fù)遇到的真實(shí)場(chǎng)景比任何文檔都值得存下來。序號(hào)可以對(duì)應(yīng)解決省得在搜索引擎里翻半天。4.1 java 提示 command not found這是裝完 JDK 后最高頻的問題。看到-bash: java: command not found時(shí)按這個(gè)順序排查第一確認(rèn)環(huán)境變量有沒有真正寫進(jìn)去。執(zhí)行echo $JAVA_HOME如果輸出是空的說明配置文件沒寫對(duì)或沒 source。檢查/etc/profile或者/etc/profile.d/java.sh里實(shí)實(shí)在在有那幾行 export。第二確認(rèn)當(dāng)前終端是否 source 過。如果是在新開的終端還找不到那大概率是文件本身寫錯(cuò)如果只是老終端沒加載執(zhí)行source /etc/profile就好。第三確認(rèn)bin/java文件存在且有執(zhí)行權(quán)限。執(zhí)行l(wèi)s -l /usr/local/java/jdk1.7.0_25/bin/java如果文件不存在說明解壓路徑或目錄名和你預(yù)期不一致回去看解壓輸出如果文件在但權(quán)限里沒有x手動(dòng)補(bǔ)一下chmod x /usr/local/java/jdk1.7.0_25/bin/java4.2 source 之后仍然調(diào)用的是舊版本表現(xiàn)是echo $JAVA_HOME已經(jīng)正確但java -version打出來還是系統(tǒng)自帶的 OpenJDK或者某個(gè)老舊的/usr/bin/java。這種情況要查兩個(gè)地方。先看which java指向哪。如果還是/usr/bin/java說明你的$JAVA_HOME/bin并沒有排在PATH最前面。打開配置文件確認(rèn)一下格式是export PATH$JAVA_HOME/bin:$PATH注意順序不是放在后面export PATH$PATH:$JAVA_HOME/bin如果順序搞反了/usr/bin里的東西會(huì)先被命中等于你的新 JDK 永遠(yuǎn)排不上號(hào)。另外 CentOS 系里/usr/bin/java往往是一個(gè)軟鏈接實(shí)際指向alternatives管理的版本。這時(shí)候即便你的PATH順序正確有些老終端因?yàn)榄h(huán)境緩存問題也還是會(huì)抓到舊的。最快的驗(yàn)證辦法是重新開一個(gè) SSH 連接再試新登錄會(huì)話會(huì)完整讀取系統(tǒng)配置環(huán)境最干凈。如果新登錄還是舊版本那就需要理解alternatives機(jī)制了后面第 5 章會(huì)專門講怎么接管系統(tǒng)級(jí)java鏈接。4.3 環(huán)境變量重啟后失效這個(gè)問題分兩種情況看。如果你寫在/etc/profile或/etc/profile.d/java.sh里那么普通登錄用戶 SSH 進(jìn)來一定會(huì)讀到重啟不重啟都一樣理論上不存在重啟后失效。真出現(xiàn)這種情況基本是某個(gè)特殊場(chǎng)景在用非登錄 shell。什么叫非登錄 shell比如用tmux、screen啟動(dòng)的終端有些系統(tǒng)腳本、crontab任務(wù)它們不一定讀/etc/profile。遇到 cron 場(chǎng)景最直接的辦法是在任務(wù)命令里再 source 一下或者直接用絕對(duì)路徑/usr/local/java/jdk1.7.0_25/bin/java -jar /opt/app/app.jar還有就是 GUI 桌面環(huán)境里終端通常作為非登錄 shell 啟動(dòng)它更依賴~/.bashrc而不是/etc/profile。如果是純服務(wù)器場(chǎng)景這個(gè)基本不用管如果機(jī)器上真有桌面用戶要用 Java可以在對(duì)應(yīng)家目錄的~/.bashrc里再寫一份同樣的 export。別嫌重復(fù)環(huán)境變量這東西本來就是誰用誰配。4.4 老 JDK 在 CentOS 7 上的字符集與安全風(fēng)險(xiǎn)JDK 7 在 CentOS 7 上最容易出現(xiàn)的另一個(gè)問題是中文亂碼。老 JDK 的默認(rèn)字符集取的是系統(tǒng) locale如果系統(tǒng) locale 不是 UTF-8或者終端環(huán)境變量傳得不對(duì)程序輸出的中文就可能變成亂碼。尤其是老系統(tǒng)里軟件本身歷史悠久代碼文件可能是 GBK 編碼放進(jìn) JDK 7 里默認(rèn)file.encoding又不對(duì)中文日志就全廢了。一個(gè)常用但不完美的辦法是設(shè)置全局 Java 選項(xiàng)export JAVA_TOOL_OPTIONS-Dfile.encodingUTF-8這條能緩解大部分亂碼但對(duì)老項(xiàng)目可能引入新問題比如某些本來按 GBK 解析的代碼會(huì)反過來出錯(cuò)。所以我的建議是先確認(rèn)代碼源文件編碼和終端編碼再?zèng)Q定是否動(dòng)file.encoding不要一上來就全局設(shè)置。最后必須強(qiáng)調(diào)安全。JDK 7u25 已經(jīng)停止公開更新很多年已知的安全漏洞數(shù)量絕對(duì)不算少。如果你是在隔離網(wǎng)絡(luò)里跑老應(yīng)用風(fēng)險(xiǎn)可控一些如果機(jī)器還要對(duì)外提供服務(wù)建議至少把端口訪問控制做好能升級(jí)到 7 系列最后幾個(gè)更新版本也好過停在這個(gè)舊版本。這種事不能說裝完能用就行老系統(tǒng)運(yùn)維首先得知道風(fēng)險(xiǎn)在哪。5. 安裝完成后的收尾與長(zhǎng)期維護(hù)建議環(huán)境變量配好、驗(yàn)證跑通其實(shí)才算完成了一半。老系統(tǒng)的特點(diǎn)是用起來容易維護(hù)起來磨人下面這幾件事建議順手做掉。5.1 用 alternatives 接管系統(tǒng)級(jí) java前面提到的/usr/bin/java實(shí)際上是被系統(tǒng)alternatives機(jī)制管理的軟鏈接。/etc/profile管的是終端命令行的PATH但有些系統(tǒng)服務(wù)、守護(hù)進(jìn)程啟動(dòng)時(shí)不讀/etc/profile它們直接走/usr/bin/java這個(gè)時(shí)候你命令行驗(yàn)證全是新版服務(wù)起來卻還是舊版。手動(dòng)接管系統(tǒng)級(jí)鏈接的命令如下alternatives --install /usr/bin/java java /usr/local/java/jdk1.7.0_25/bin/java 100 alternatives --install /usr/bin/javac javac /usr/local/java/jdk1.7.0_25/bin/javac 100 alternatives --config java第一條命令是把我們的java注冊(cè)進(jìn)系統(tǒng)候選列表優(yōu)先級(jí) 100。執(zhí)行alternatives --config java后會(huì)列出所有候選版本輸對(duì)應(yīng)數(shù)字選擇即可。這樣/usr/bin/java這個(gè)軟鏈接就精確指向了我們裝的 7u25對(duì)不讀PATH的服務(wù)和腳本也生效整個(gè)系統(tǒng)層面的 Java 版本才算真正統(tǒng)一。這一步我強(qiáng)烈建議做可靠性和可維護(hù)性都會(huì)高很多。5.2 離線安裝包的歸檔與版本記錄老系統(tǒng)環(huán)境里安裝包搞丟、版本搞混是常事。我自己的習(xí)慣是把jdk-7u25-linux-x64.tar.gz連同它的 MD5 校驗(yàn)值存進(jìn)固定目錄同時(shí)在目標(biāo)安裝目錄里放一個(gè)簡(jiǎn)單的記錄文件cat /usr/local/java/INSTALL_NOTE.txt EOF 2025-xx-xx installed jdk-7u25-linux-x64.tar.gz source: /opt/downloads/jdk-7u25-linux-x64.tar.gz md5: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx installed to: /usr/local/java/jdk1.7.0_25 config: /etc/profile.d/java.sh EOF這個(gè)文件不值錢但半年后甚至一年后你再來看這臺(tái)機(jī)器一眼就能知道裝了哪個(gè)版本、從哪兒來的、配置在哪省去大量重新排查時(shí)間。寫代碼要注釋環(huán)境維護(hù)也一樣給自己的機(jī)器留筆記一點(diǎn)都不丟人。5.3 給其他用戶和后臺(tái)服務(wù)統(tǒng)一 JDK最后要說的是部署服務(wù)時(shí)的統(tǒng)一。Tomcat 這類中間件依靠JAVA_HOME環(huán)境變量而 systemd 管理的服務(wù)在啟動(dòng)時(shí)并不繼承/etc/profile里的內(nèi)容所以假如某個(gè)服務(wù)跑在 systemd 里你得在服務(wù)單元里顯式聲明[Service] EnvironmentJAVA_HOME/usr/local/java/jdk1.7.0_25 EnvironmentPATH/usr/local/java/jdk1.7.0_25/bin:/usr/bin:/bin如果服務(wù)使用獨(dú)立用戶運(yùn)行也順手確認(rèn)一下那個(gè)用戶的登錄 shell 配置。統(tǒng)一原則就一句話讓每個(gè)使用者都能明確感知到哪里去拿 JDK而不是靠系統(tǒng)里某個(gè)飄忽不定的默認(rèn)設(shè)置。我個(gè)人裝完這些老系統(tǒng)的 JDK還有一個(gè)一直保留的習(xí)慣驗(yàn)證通過后不急著刪安裝包放到/opt/downloads保存并順手把日期和版本寫進(jìn)記錄。這臺(tái)機(jī)器凡是經(jīng)過我手裝過一遍下次再動(dòng)的時(shí)候絕對(duì)不用從零開始猜。這套流程雖然老但穩(wěn)定可靠希望也能幫你的老系統(tǒng)維護(hù)省點(diǎn)力氣。