戰(zhàn))
簡介本資源為 Java 14 的 OpenJDK JRE 運(yùn)行環(huán)境安裝包面向需要在 Windows 平臺上運(yùn)行 Java 14 應(yīng)用的開發(fā)者與運(yùn)維人員尤其適合 Red Hat 系發(fā)行版環(huán)境下的部署與測試場景。壓縮包共 358 個(gè)文件以 82 個(gè) dll 動(dòng)態(tài)鏈接庫、25 個(gè) exe 可執(zhí)行程序?yàn)楹诵妮o以大量 license 與 additional_license_info 許可說明、assembly_exception 裝配異常記錄、md 文檔及 policy、properties 等配置資源整體約 59.57MB結(jié)構(gòu)完整、依賴齊全。目前已有 622 人學(xué)習(xí)下載說明該版本在社區(qū)中具備一定使用需求。包內(nèi)包含 jmxremote.access 等安全訪問控制文件、cacerts 證書庫、modules 模塊定義與 release 版本信息可幫助讀者快速搭建可運(yùn)行的 JRE 環(huán)境理解 OpenJDK 發(fā)行版的目錄組織與許可合規(guī)要求適合作為本地開發(fā)調(diào)試或服務(wù)端運(yùn)行的基礎(chǔ)依賴。1. 從一次 Windows 環(huán)境部署翻車說起這個(gè) JRE 包到底裝的是什么上周幫一個(gè)做桌面工具的朋友排查問題他那邊報(bào)錯(cuò)日志里反復(fù)出現(xiàn)UnsupportedClassVersionError本地java -version一看是 1.8但項(xiàng)目編譯用的是 14。他第一反應(yīng)是去官網(wǎng)翻下載頁結(jié)果被一堆 JDK、JRE、OpenJDK、Oracle JDK 的選項(xiàng)繞暈了隨手下了個(gè)安裝器裝完發(fā)現(xiàn)路徑里多了一堆開發(fā)工具體積也上去了。其實(shí)他只需要一個(gè)能跑字節(jié)碼的運(yùn)行時(shí)不需要編譯器、不需要 jshell、不需要 jlink。這次要拆的這個(gè)包文件名已經(jīng)把信息給全了java-14-openjdk-jre-14.0.1.7-1.windows.redhat.x86_64.zip。拆開看java-14是版本線openjdk是上游實(shí)現(xiàn)jre說明它只含運(yùn)行時(shí)不含開發(fā)工具14.0.1.7-1是 Red Hat 的構(gòu)建號windows和x86_64鎖定平臺和架構(gòu).zip說明它是免安裝的壓縮分發(fā)不是 msi/exe 安裝器。對一線從業(yè)者來說這種 zip 形態(tài)的 JRE 最大的價(jià)值就是可控解壓到哪、用哪個(gè)版本、怎么切全在自己手里不會往注冊表和系統(tǒng)目錄里塞東西。它適合誰一類是需要在 Windows 上跑 Java 14 編譯產(chǎn)物、但不想裝完整 JDK 的部署場景一類是機(jī)器上已經(jīng)有好幾個(gè) Java 版本想用目錄隔離的方式做版本切換的人還有一類是做 CI 或打包分發(fā)需要把運(yùn)行時(shí)跟應(yīng)用捆在一起走的。如果你是要寫代碼、要編譯、要用javac那這個(gè)包不夠得換 JDK。下面按「它是什么 → 怎么落地 → 坑在哪 → 怎么驗(yàn)證」的順序拆開講。2. OpenJDK JRE 與 Oracle JDK 的選型差異為什么偏偏選這個(gè) zip2.1 JRE 和 JDK 的邊界到底在哪很多人把 JRE 和 JDK 當(dāng)成大小不同的同一個(gè)東西實(shí)際邊界很清楚。JRE 包含 JVM、核心類庫、字體與本地庫能執(zhí)行.class和.jarJDK 在 JRE 基礎(chǔ)上多了javac、jar、javadoc、jshell、jlink等開發(fā)工具。判斷標(biāo)準(zhǔn)很簡單你只需要java -jar跑起來那就是 JRE 的活你要javac編譯源碼那就必須 JDK。這個(gè)包是 JRE意味著解壓后bin目錄里不會有javac.exe。有人解壓完發(fā)現(xiàn)沒有編譯器就以為包壞了其實(shí)不是是選錯(cuò)了類型。常見做法是開發(fā)機(jī)裝 JDK部署機(jī)裝 JRE兩邊版本線對齊。這樣部署機(jī)上少幾百 MB 的工具鏈攻擊面也小一些。2.2 為什么是 OpenJDK 而不是 Oracle JDKOpenJDK 是上游參考實(shí)現(xiàn)Oracle JDK 是在其基礎(chǔ)上加了商業(yè)特性的構(gòu)建。對絕大多數(shù)業(yè)務(wù)代碼來說兩者在字節(jié)碼執(zhí)行層面沒有可感知差異。選 OpenJDK 的理由通常有三條分發(fā)許可更清晰便于隨應(yīng)用一起打包構(gòu)建來源可追溯適合需要固定運(yùn)行時(shí)版本的生產(chǎn)環(huán)境不依賴特定廠商的安裝器zip 解壓即用。這里要區(qū)分一個(gè)容易混的點(diǎn)Red Hat 構(gòu)建的 OpenJDK 和 Oracle 構(gòu)建的 OpenJDK 都是 OpenJDK 的下游產(chǎn)物構(gòu)建號不同補(bǔ)丁節(jié)奏可能不同。文件名里的14.0.1.7-1就是 Red Hat 側(cè)的構(gòu)建標(biāo)識14.0.1對應(yīng)上游版本后面的.7-1是構(gòu)建與修訂號。選型時(shí)不要只看14要連構(gòu)建號一起記錄否則兩臺機(jī)器上同為「Java 14」但構(gòu)建號不同排查問題時(shí)會對不上。2.3 zip 分發(fā)相比安裝器的實(shí)際收益安裝器會寫注冊表、設(shè)JAVA_HOME、往Program Files放文件卸載時(shí)還可能留殘留。zip 分發(fā)把這些全交給你解壓到任意目錄環(huán)境變量自己配不想要了直接刪目錄。對需要多版本共存的機(jī)器這一點(diǎn)很關(guān)鍵。維度zip 免安裝exe/msi 安裝器安裝痕跡僅解壓目錄注冊表 系統(tǒng)目錄多版本共存目錄隔離天然支持需手動(dòng)改 PATH易沖突卸載刪目錄走卸載流程可能殘留適合場景部署、CI、隨應(yīng)用打包個(gè)人開發(fā)機(jī)一次性安裝提示zip 分發(fā)不會自動(dòng)配置任何環(huán)境變量解壓后必須手動(dòng)指定路徑否則命令行里調(diào)用的還是系統(tǒng)里原有的 Java。3. Windows 下解壓與運(yùn)行時(shí)配置從目錄規(guī)劃到 PATH 生效3.1 解壓位置的選擇與目錄結(jié)構(gòu)確認(rèn)不要解壓到帶空格或中文的路徑比如C:\Program Files\或D:\我的工具\(yùn)。JVM 本身能處理但某些依賴本地庫路徑拼接的第三方組件會在空格處翻車這是血淚經(jīng)驗(yàn)。我一般放在D:\runtime\下按版本建子目錄。# 假設(shè) zip 已下載到 D:\downloads\ # 用 PowerShell 解壓到指定目錄避免路徑含空格 Expand-Archive -Path D:\downloads\java-14-openjdk-jre-14.0.1.7-1.windows.redhat.x86_64.zip -DestinationPath D:\runtime\jre-14.0.1.7 # 查看解壓后的頂層結(jié)構(gòu) Get-ChildItem D:\runtime\jre-14.0.1.7解壓后通常會出現(xiàn)一個(gè)以版本命名的頂層目錄里面才是bin、lib、conf等。如果直接解壓出一堆散文件說明壓縮包內(nèi)層還有一層目錄需要再進(jìn)一層確認(rèn)bin\java.exe的實(shí)際位置。這一步別跳過后面配 PATH 全靠這個(gè)路徑。3.2 臨時(shí)驗(yàn)證與永久環(huán)境變量配置先做臨時(shí)驗(yàn)證確認(rèn)這個(gè)運(yùn)行時(shí)本身能跑再去改系統(tǒng)環(huán)境變量。順序反了的話PATH 配錯(cuò)會導(dǎo)致命令行里所有 Java 命令都異常排查起來更麻煩。# 臨時(shí)把該 JRE 的 bin 放到當(dāng)前會話 PATH 最前面 $env:Path D:\runtime\jre-14.0.1.7\bin; $env:Path # 驗(yàn)證版本輸出應(yīng)包含 14.0.1 與構(gòu)建號 java -version # 確認(rèn) java.exe 的實(shí)際來源防止調(diào)用了別的版本 (Get-Command java).Sourcejava -version的輸出會打到標(biāo)準(zhǔn)錯(cuò)誤流這是歷史遺留行為不是報(bào)錯(cuò)。重點(diǎn)看三行版本號、構(gòu)建號、VM 信息。(Get-Command java).Source用來確認(rèn)當(dāng)前生效的到底是哪個(gè)java.exe多版本機(jī)器上這一步能省掉大量玄學(xué)排查。永久配置走系統(tǒng)環(huán)境變量把D:\runtime\jre-14.0.1.7\bin加到用戶級Path的最前面而不是追加到末尾。追加到末尾的話系統(tǒng)里原有的 Java 8 會優(yōu)先命中等于白配。改完要新開一個(gè)終端窗口才生效已開的窗口讀的是舊環(huán)境。3.3 用 JAVA_HOME 做版本切換的穩(wěn)定做法只靠 PATH 切換版本順序一亂就失效。更穩(wěn)的做法是設(shè)JAVA_HOME指向 JRE 根目錄PATH 里引用%JAVA_HOME%\bin。這樣切版本只需要改JAVA_HOME一個(gè)變量。# 用戶級設(shè)置 JAVA_HOME指向 JRE 根目錄而非 bin [Environment]::SetEnvironmentVariable(JAVA_HOME, D:\runtime\jre-14.0.1.7, User) # PATH 中引用 JAVA_HOME注意放在其他 Java 路徑之前 $oldPath [Environment]::GetEnvironmentVariable(Path, User) $newPath %JAVA_HOME%\bin; $oldPath [Environment]::SetEnvironmentVariable(Path, $newPath, User)參數(shù)說明User表示用戶級只影響當(dāng)前賬戶不需要管理員權(quán)限如果要做全局部署換成Machine但需要提權(quán)。改完關(guān)掉所有終端重開再跑一次java -version和(Get-Command java).Source雙重確認(rèn)。注意JAVA_HOME指向的是根目錄不是bin這是最常見的配錯(cuò)點(diǎn)。4. 版本共存與依賴排查多 JRE 環(huán)境下的常見坑4.1 多版本共存時(shí)的優(yōu)先級規(guī)則Windows 上 PATH 是從左到右匹配第一個(gè)命中的java.exe生效。所以共存的關(guān)鍵不是裝了幾個(gè)版本而是 PATH 里的順序。我一般把要用的版本放最前其余版本只保留目錄不放進(jìn) PATH需要時(shí)臨時(shí)改。# 查看當(dāng)前 PATH 中所有含 java 的路徑按優(yōu)先級排列 $env:Path -split ; | Where-Object { $_ -match java|jre|jdk } # 列出機(jī)器上可能存在的其他 java.exe確認(rèn)沒有遺漏 Get-ChildItem -Path C:\Program Files\,D:\runtime\ -Recurse -Filter java.exe -ErrorAction SilentlyContinue | Select-Object FullName第一條命令幫你確認(rèn) PATH 里的 Java 路徑順序第二條幫你找出機(jī)器上所有java.exe。兩條結(jié)合就能判斷為什么java -version出來的不是你預(yù)期的版本。這一步在多版本機(jī)器上幾乎是必做的。4.2 應(yīng)用啟動(dòng)腳本里硬編碼路徑的排查有些應(yīng)用啟動(dòng)腳本里直接寫死了java的絕對路徑或者寫死了JAVA_HOME。這種情況下你系統(tǒng)環(huán)境變量配得再對也沒用腳本根本不讀。排查方法是打開啟動(dòng)腳本搜java、JAVA_HOME、JRE_HOME這幾個(gè)關(guān)鍵詞。# 在啟動(dòng)腳本目錄里搜索硬編碼的 java 路徑引用 Select-String -Path .\*.bat,.\*.cmd,.\*.ps1 -Pattern java|JAVA_HOME|JRE_HOME -CaseSensitive:$false如果發(fā)現(xiàn)腳本里寫的是舊版本路徑要么改腳本要么在腳本執(zhí)行前覆蓋對應(yīng)變量。改腳本更徹底但要注意別把腳本改壞先備份。常見做法是在腳本開頭加一段變量覆蓋把JAVA_HOME指到新版本這樣不動(dòng)原有邏輯。4.3 常見問題排查清單現(xiàn)象一java -version顯示的還是舊版本。原因PATH 里舊版本路徑排在新版本前面或者改了環(huán)境變量但沒重開終端。 解決用(Get-Command java).Source確認(rèn)實(shí)際命中的路徑調(diào)整 PATH 順序關(guān)掉所有終端重開。現(xiàn)象二解壓后bin目錄里沒有javac.exe。原因這個(gè)包是 JRE本來就不含開發(fā)工具。 解決確認(rèn)需求如果只是運(yùn)行就正常如果需要編譯換 JDK 包不要試圖在 JRE 里找編譯器?,F(xiàn)象三應(yīng)用報(bào)UnsupportedClassVersionError提示 class file version 58。原因class file version 58 對應(yīng) Java 14說明應(yīng)用是用 Java 14 編譯的但當(dāng)前運(yùn)行時(shí)低于 14。 解決確認(rèn)java -version輸出為 14.x并檢查啟動(dòng)腳本是否硬編碼了舊路徑。現(xiàn)象四路徑含空格導(dǎo)致本地庫加載失敗。原因某些第三方組件在拼接java.library.path時(shí)不處理空格。 解決把 JRE 解壓到無空格、無中文的路徑重新配置環(huán)境變量。現(xiàn)象五改了系統(tǒng)環(huán)境變量但某個(gè)服務(wù)仍用舊版本。原因Windows 服務(wù)啟動(dòng)時(shí)讀的是服務(wù)賬戶的環(huán)境變量不是你當(dāng)前用戶的環(huán)境變量。 解決在服務(wù)屬性里檢查啟動(dòng)賬戶或直接在服務(wù)配置里指定java的絕對路徑。注意排查版本問題時(shí)永遠(yuǎn)先確認(rèn)「實(shí)際生效的是哪個(gè) java.exe」再去看版本號。順序反了容易在錯(cuò)誤的方向上浪費(fèi)時(shí)間。5. 驗(yàn)證運(yùn)行時(shí)是否真正可用一個(gè)最小可復(fù)現(xiàn)的檢查流程5.1 用最小 class 文件驗(yàn)證字節(jié)碼執(zhí)行光看java -version不夠那只證明啟動(dòng)器能跑不證明類庫完整。最直接的驗(yàn)證是編譯一個(gè)最小 class 再用這個(gè) JRE 跑。因?yàn)?JRE 沒有javac可以先用其他 JDK 編譯好或者直接用現(xiàn)成的 jar 測。# 用現(xiàn)有 JDK 編譯一個(gè)最小類如果機(jī)器上有 JDK # 源碼 Hello.java 內(nèi)容public class Hello { public static void main(String[] a){ System.out.println(ok); } } javac -d . Hello.java # 用目標(biāo) JRE 執(zhí)行確認(rèn)字節(jié)碼能正常加載運(yùn)行 D:\runtime\jre-14.0.1.7\bin\java -cp . Hello如果輸出ok說明 JVM、核心類庫、字節(jié)碼加載鏈路都正常。如果報(bào)NoClassDefFoundError或類庫相關(guān)異常說明解壓不完整或目錄結(jié)構(gòu)不對重新解壓。5.2 檢查關(guān)鍵系統(tǒng)屬性與類庫路徑運(yùn)行時(shí)的一些關(guān)鍵屬性決定了它能不能找到本地庫、字符集是否正確。用-XshowSettings可以一次性打出來比逐個(gè)猜要快。# 打印 VM 設(shè)置、系統(tǒng)屬性、類庫路徑 D:\runtime\jre-14.0.1.7\bin\java -XshowSettings:properties -version 21 | Select-String java.home|java.version|java.library.path|file.encoding重點(diǎn)看四個(gè)值java.home應(yīng)該指向你解壓的 JRE 根目錄java.version應(yīng)該是 14.0.1java.library.path應(yīng)該包含該 JRE 的bin目錄file.encoding在 Windows 上通常是 GBK 或 UTF-8取決于系統(tǒng)區(qū)域設(shè)置。如果java.home指向了別的目錄說明你調(diào)用的不是這個(gè) JRE回到 PATH 排查。5.3 把驗(yàn)證步驟固化成腳本每次換機(jī)器都手動(dòng)敲一遍太累也不容易保證一致性。我一般寫一個(gè)檢查腳本把版本、路徑、關(guān)鍵屬性、最小執(zhí)行四件事串起來跑一遍就知道環(huán)境對不對。# check-jre.ps1傳入 JRE 根目錄輸出檢查結(jié)果 param([string]$JreHome D:\runtime\jre-14.0.1.7) $java Join-Path $JreHome bin\java.exe if (-not (Test-Path $java)) { Write-Host java.exe 不存在檢查路徑; exit 1 } Write-Host 版本 $java -version 21 Write-Host 關(guān)鍵屬性 $java -XshowSettings:properties -version 21 | Select-String java.home|java.version|java.library.path Write-Host 實(shí)際路徑 (Get-Command $java).Source參數(shù)說明$JreHome傳 JRE 根目錄腳本內(nèi)部拼bin\java.exe。這個(gè)腳本可以放進(jìn)部署流程里每次環(huán)境初始化后跑一次輸出留檔。從那以后我每次給新機(jī)器配 Java 運(yùn)行時(shí)都強(qiáng)制先跑一遍這個(gè)檢查確認(rèn)java.home和實(shí)際路徑一致再往下走省掉了很多「明明配了卻沒用」的返工。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取