指南)
簡介JDK 1.8 免安裝版面向需要快速搭建 Java 開發(fā)與運(yùn)行環(huán)境的開發(fā)者、學(xué)習(xí)者及測試人員下載解壓后即可使用省去安裝向?qū)c環(huán)境變量配置適合臨時(shí)驗(yàn)證程序、課程實(shí)驗(yàn)或受限環(huán)境下部署。壓縮包共 1475 個(gè)文件約 173.74MB以 722 個(gè) jar 為核心運(yùn)行庫輔以 xml 配置、dll 與 exe 可執(zhí)行組件、properties 參數(shù)文件及 html 說明文檔目錄結(jié)構(gòu)保留完整 JDK 組成。包內(nèi)還提供源代碼壓縮包、include 頭文件、lib 庫文件及版本與許可說明便于查閱 Java 內(nèi)部實(shí)現(xiàn)、完成編譯鏈接和了解發(fā)行信息。已有 536 人學(xué)習(xí)可作為快速上手 JDK 8、排查環(huán)境問題和研究源碼的輕量工具包。1. JDK 1.8免安裝包為什么“解壓就能用”反而更容易配錯(cuò)某開發(fā)者在一臺不能隨意裝軟件的內(nèi)網(wǎng)機(jī)上配Jdk8雙擊安裝包被權(quán)限攔住換成jdk1.8免安裝版后解壓就能打開命令行結(jié)果java -version指向了舊版javac又找不到。jdk1.8免安裝版下載可直接使用但“免安裝”只省掉了安裝程序不省環(huán)境變量解壓目錄、JAVA_HOME、Path順序任何一處寫錯(cuò)編譯和運(yùn)行就會分叉。這類包最適合無管理員權(quán)限、需要多版本共存、要快速復(fù)制一套開發(fā)環(huán)境的場景。裝不好不會立刻報(bào)大錯(cuò)而是項(xiàng)目里突然出現(xiàn)類找不到、IDE識別不到JDK、Maven拉到一半換版本。下面按解壓、配變量、排錯(cuò)、驗(yàn)證的順序走一遍照著做能少踩很多坑。2. 下載與解壓JDK 8壓縮包的目錄結(jié)構(gòu)和放置路徑免安裝版在Windows上通常是zip包Linux上是tar.gz包。它和安裝版的區(qū)別不在功能而在部署方式安裝版會寫注冊表、可能裝公共JRE、順帶改系統(tǒng)Path免安裝版只是把完整的JDK目錄放到某個(gè)路徑下用的時(shí)候靠環(huán)境變量指過去。也正因?yàn)椴粚懽员鞩DE、Maven、Tomcat有時(shí)候不會自動(dòng)發(fā)現(xiàn)它JAVA_HOME就成了必須配的一項(xiàng)。我一般把這類包當(dāng)成“可復(fù)制的工具目錄”來管壓縮包留一份解壓后的目錄按版本命名換機(jī)器時(shí)直接復(fù)制目錄再改變量。這樣做的代價(jià)是路徑要自己規(guī)劃不能像安裝版那樣一路下一步。下面先把選包和解壓路徑定下來后面配變量才不會反復(fù)返工。2.1 選對壓縮包JDK和JRE、32位和64位先分清拿到j(luò)dk1.8免安裝版壓縮包后先看文件名和目錄不要急著解壓。JDK 8的免安裝包頂層目錄通常形如jdk1.8.0_XXX里面同時(shí)有bin和jre兩個(gè)目錄如果壓縮包解開只有jre那它是運(yùn)行環(huán)境不帶javac不能用來編譯。判斷方法很簡單看bin下有沒有javac.exe有才是JDK。位數(shù)也要對上?,F(xiàn)在大多數(shù)開發(fā)機(jī)是64位系統(tǒng)選windows-x64的包只有確實(shí)在32位系統(tǒng)或舊環(huán)境里跑才用x86包。位數(shù)不匹配時(shí)有的機(jī)器會直接報(bào)無法加載有的則表現(xiàn)為啟動(dòng)失敗但提示很含糊這種問題排查起來很費(fèi)時(shí)間。文件名里帶x64、x86、windows這些標(biāo)識解壓前先核對一遍。還有一點(diǎn)容易被忽略不要拿安裝版目錄里復(fù)制出來的jre目錄冒充免安裝JDK。JRE只負(fù)責(zé)運(yùn)行不包含編譯器項(xiàng)目里只要出現(xiàn)javac、Maven編譯、IDE建索引就會暴露。選包時(shí)以“頂層目錄里同時(shí)有bin\javac.exe和jre”為準(zhǔn)。檢查項(xiàng)正確表現(xiàn)常見錯(cuò)誤頂層目錄jdk1.8.0_XXX直接解到bin或jre編譯器bin\javac.exe存在只有java.exe運(yùn)行環(huán)境jre\bin\java.exe存在把JRE當(dāng)JDK位數(shù)與系統(tǒng)一致32位包跑在64位項(xiàng)目里提示壓縮包來源不同頂層目錄名可能略有差異但bin、jre、lib這幾個(gè)關(guān)鍵目錄的結(jié)構(gòu)不會變。解壓后先看結(jié)構(gòu)再配變量。2.2 解壓到哪個(gè)目錄避開空格、中文和受控路徑解壓路徑比很多人想得重要。Windows下我一般放到C:\dev\jdk1.8.0_XXXdev是自己建的工具目錄短、無空格、無中文。不要放在Program Files下面那里寫文件常要管理員權(quán)限后面配腳本、裝依賴、IDE生成索引都可能被攔也不要放桌面或下載目錄的深層路徑路徑太長時(shí)某些舊工具會截?cái)?。解壓后確認(rèn)頂層目錄就是jdk1.8.0_XXX不要出現(xiàn)jdk1.8.0_XXX\jdk1.8.0_XXX這種重復(fù)嵌套。有的人用解壓工具時(shí)勾了“解壓到同名文件夾”外層又多一層配JAVA_HOME時(shí)很容易指到外層結(jié)果工具拼出來的bin\java.exe根本不存在。配變量前先把目錄層級看準(zhǔn)。如果機(jī)器上沒有管理員權(quán)限C:\dev一般也能創(chuàng)建實(shí)在不行就放到當(dāng)前用戶目錄下的工具目錄仍然保持短路徑和無空格。路徑里不要出現(xiàn)、%、!這類字符命令行和腳本解析時(shí)會出問題。這個(gè)習(xí)慣不值錢但能省掉很多“明明配了卻找不到”的排查。2.3 校驗(yàn)壓縮包并做一次解壓后自檢壓縮包從網(wǎng)絡(luò)傳到本地可能不完整。正式解壓前做一次哈希校驗(yàn)把發(fā)行方提供的校驗(yàn)值和本地結(jié)果對一下沒有校驗(yàn)值就至少確認(rèn)壓縮包能完整解開、目錄不缺文件。Windows下可以用系統(tǒng)自帶的證書工具算SHA256certutil -hashfile jdk-8uXXX-windows-x64.zip SHA256這條命令只做一件事對壓縮包做SHA256摘要輸出一串哈希值。-hashfile后面跟文件路徑SHA256是指定算法文件路徑有空格時(shí)要加引號。算出來的值要和發(fā)行方給出的值逐位一致不一致就重新獲取壓縮包不要繼續(xù)解壓。解壓后做一次目錄自檢重點(diǎn)看四個(gè)位置bin\java.exe、bin\javac.exe、jre\bin\java.exe、lib\tools.jar。前兩個(gè)決定能不能編譯和運(yùn)行第三個(gè)決定運(yùn)行時(shí)環(huán)境是否完整第四個(gè)在舊項(xiàng)目里可能被CLASSPATH引用。少一個(gè)都別急著往下走先換壓縮包或重新解壓。Linux下的免安裝包一般是tar.gz解壓和放置方式類似sudo mkdir -p /opt/jdk sudo tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /opt/jdk ls -l /opt/jdk/jdk1.8.0_XXX/bin/javactar -zxvf里z表示gzip解壓x表示解包v顯示過程f指定文件-C把內(nèi)容解到指定目錄。最后一條ls是自檢確認(rèn)javac存在。Linux下同樣建議用/opt/jdk1.8.0_XXX這種短路徑后面寫/etc/profile.d腳本時(shí)更穩(wěn)。3. 配置環(huán)境變量JAVA_HOME、Path、CLASSPATH 三個(gè)變量的寫法免安裝版沒有安裝程序幫你寫注冊表環(huán)境變量就是它和系統(tǒng)之間的“接頭暗號”。JAVA_HOME告訴Maven、Gradle、Tomcat、IDE去哪里找JDKPath告訴命令行去哪個(gè)目錄找java.exe和javac.exeCLASSPATH告訴JVM去哪里找類文件。三個(gè)變量里前兩個(gè)必須配第三個(gè)按項(xiàng)目需要配不要一上來就抄一堆舊教程。Windows下還要區(qū)分用戶變量和系統(tǒng)變量。用戶變量只對當(dāng)前用戶生效不需要管理員權(quán)限系統(tǒng)變量對所有用戶生效改的時(shí)候通常要管理員。沒有權(quán)限的機(jī)器優(yōu)先用用戶變量再配合當(dāng)前窗口的臨時(shí)腳本。這里有個(gè)容易翻車的點(diǎn)Windows合并Path時(shí)系統(tǒng)Path在前、用戶Path在后如果系統(tǒng)Path里已經(jīng)有舊JDK的bin只改用戶Path不一定能搶到前面后面排錯(cuò)章節(jié)會細(xì)說。3.1 JAVA_HOME寫頂層目錄不帶bin、不帶引號JAVA_HOME的值就是解壓后的頂層目錄例如C:\dev\jdk1.8.0_XXX。不要寫成C:\dev\jdk1.8.0_XXX\bin因?yàn)镸aven、Tomcat這些工具會在JAVA_HOME后面自己拼\bin你多寫一層它們就拼成\bin\bin\java.exe。也不要帶引號、結(jié)尾分號或反斜杠很多腳本不會幫你清理這些字符。圖形界面操作順序是WinR輸入sysdm.cpl進(jìn)入“高級”里的“環(huán)境變量”在用戶變量里新建JAVA_HOME值填頂層目錄。然后編輯用戶變量里的Path新建一行%JAVA_HOME%\bin把它上移到靠前位置。改完不要在當(dāng)前已經(jīng)打開的命令行里反復(fù)試先關(guān)掉重開新進(jìn)程才會讀到新變量。如果使用命令行設(shè)置setx可以寫用戶變量但它只影響新開的窗口當(dāng)前窗口不生效路徑里有空格時(shí)要用引號包住整個(gè)賦值。更穩(wěn)的方式是用PowerShell精確設(shè)置避免setx Path把系統(tǒng)Path展開后寫進(jìn)用戶Path造成長度截?cái)嗷蛑貜?fù)。下面這段腳本做三件事寫JAVA_HOME、把%JAVA_HOME%\bin加到用戶Path最前、去重。$jdkHome C:\dev\jdk1.8.0_XXX # 改成你的JDK頂層目錄不要帶\bin [Environment]::SetEnvironmentVariable(JAVA_HOME, $jdkHome, User) $oldPath [Environment]::GetEnvironmentVariable(Path, User) $bin Join-Path $jdkHome bin $parts () if (-not [string]::IsNullOrWhiteSpace($oldPath)) { $parts $oldPath -split ; | Where-Object { $_ -and $_ -ne $bin } } $newPath (($bin) $parts) -join ; [Environment]::SetEnvironmentVariable(Path, $newPath, User)$jdkHome是頂層目錄Join-Path自動(dòng)拼出bin路徑User表示寫當(dāng)前用戶變量不需要管理員權(quán)限。$oldPath -split ;把舊Path拆成數(shù)組Where-Object去掉空項(xiàng)和重復(fù)的bin最后把JDK的bin放在最前面。執(zhí)行完關(guān)掉PowerShell重新開一個(gè)窗口再用echo %JAVA_HOME%和where java確認(rèn)。注意這段腳本只改用戶變量。如果系統(tǒng)Path里已經(jīng)有一個(gè)舊JDK的bin并且系統(tǒng)Path排在前面where java可能仍然先命中舊版。遇到這種情況不要反復(fù)重裝先看第4章的排錯(cuò)順序。3.2 Path順序決定命令行先找到哪個(gè)javaPath是一個(gè)按順序查找的目錄列表。命令行輸入java時(shí)系統(tǒng)從Path第一個(gè)目錄開始找java.exe找到就停。所以把%JAVA_HOME%\bin放在前面才能讓當(dāng)前用戶優(yōu)先使用這套JDK 8。只配JAVA_HOME不配Path命令行仍然找不到j(luò)ava只配Path不配JAVA_HOME命令行能跑但Maven、Tomcat、IDE可能找不到JDK。配置Path時(shí)注意兩點(diǎn)第一寫%JAVA_HOME%\bin不要寫死C:\dev\jdk1.8.0_XXX\bin以后換目錄只改JAVA_HOME第二不要把%JAVA_HOME%\jre\bin放在前面jre\bin里只有運(yùn)行工具沒有javac編譯時(shí)還是會報(bào)找不到。Path里也不要保留多個(gè)JDK的bin尤其不要把舊版放在前面。多版本共存時(shí)我一般不在系統(tǒng)變量里反復(fù)改而是寫兩個(gè)當(dāng)前窗口用的啟動(dòng)腳本一個(gè)切JDK 8一個(gè)切另一個(gè)版本。腳本只影響當(dāng)前命令行窗口不改系統(tǒng)環(huán)境適合臨時(shí)驗(yàn)證項(xiàng)目。下面這個(gè)腳本把JDK 8的bin前置到當(dāng)前Path然后打開一個(gè)新的命令行窗口echo off set JAVA_HOMEC:\dev\jdk1.8.0_XXX set PATH%JAVA_HOME%\bin;%PATH% where java java -version cmd /kset JAVA_HOME...的引號包住整個(gè)賦值避免路徑尾部空格進(jìn)入變量set PATH...把JDK 8的bin放在當(dāng)前Path最前面只對當(dāng)前窗口生效where java檢查實(shí)際命中的路徑cmd /k讓窗口保留方便繼續(xù)執(zhí)行javac。這個(gè)腳本適合沒有管理員權(quán)限、又不想改系統(tǒng)變量的機(jī)器也適合臨時(shí)切換版本。3.3 CLASSPATH不要亂抄舊項(xiàng)目才按需設(shè)CLASSPATH是JVM查找類文件的路徑。Java 8時(shí)代很多舊教程會讓你設(shè).;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar這在某些老項(xiàng)目里確實(shí)能解決編譯問題但新項(xiàng)目一般不需要設(shè)錯(cuò)反而會覆蓋默認(rèn)行為。最常見的翻車是只寫了jar路徑忘了前面的.導(dǎo)致當(dāng)前目錄下的類找不到運(yùn)行時(shí)報(bào)Could not find or load main class。我的做法是新環(huán)境先不設(shè)CLASSPATH讓JVM用默認(rèn)值只有項(xiàng)目明確要求或者用javac編譯時(shí)確實(shí)找不到tools.jar里的類才臨時(shí)在腳本里加。要設(shè)的話至少保留.表示當(dāng)前目錄例如set CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar這條命令只在當(dāng)前窗口生效.表示當(dāng)前目錄dt.jar和tools.jar是JDK 8里舊工具可能引用的包。不要把這個(gè)值寫到系統(tǒng)變量里長期生效除非你清楚項(xiàng)目依賴換項(xiàng)目時(shí)忘了清掉就會出現(xiàn)“代碼沒問題但類加載不到”的黑匣子式問題。臨時(shí)設(shè)、臨時(shí)用項(xiàng)目結(jié)束就關(guān)窗口是最省事的做法。3.4 配置完成后先做一次新窗口檢查環(huán)境變量改完后當(dāng)前已經(jīng)打開的cmd、PowerShell、IDE都不會自動(dòng)刷新。正確做法是關(guān)掉重開再執(zhí)行三條檢查echo %JAVA_HOME%看值是不是頂層目錄where java看命中的是不是%JAVA_HOME%\bin\java.exejava -version看版本是不是1.8。三條都對了再往項(xiàng)目里接。如果echo %JAVA_HOME%有值但where java不是自己的路徑說明Path順序被系統(tǒng)Path或舊變量搶了如果where java對但javac找不到說明Path只指到了JRE或者解壓包不完整。先別改項(xiàng)目配置把這三個(gè)檢查做順后面能少一半問題。4. 避坑與排查JDK 8免安裝版最常見的五類翻車免安裝版的坑大多不在解壓而在“變量看起來配了實(shí)際沒生效”。下面五類是我在開發(fā)機(jī)和構(gòu)建機(jī)上反復(fù)見到的有的當(dāng)場報(bào)錯(cuò)有的過兩天才在Maven或IDE里爆出來。每條按現(xiàn)象、原因、解決寫照著順序查基本能定位到是目錄、變量還是Path順序的問題。4.1 五類高頻問題從現(xiàn)象倒推原因現(xiàn)象一java -version能出版本javac -version提示“不是內(nèi)部或外部命令”。原因通常是Path只指向了jre\bin或者解壓的包本身是JREJRE里有java.exe但沒有javac.exe所以運(yùn)行能過、編譯過不了。解決是確認(rèn)JAVA_HOME指向JDK頂層目錄Path寫%JAVA_HOME%\bin然后檢查%JAVA_HOME%\bin\javac.exe是否存在不存在就重新獲取JDK包不要拿JRE湊合?,F(xiàn)象二java -version顯示1.8但where java指向的不是自己解壓的目錄或者版本號是舊更新。原因多半是系統(tǒng)Path里舊JDK的bin排在前面用戶Path的%JAVA_HOME%\bin排在后面Windows合并Path時(shí)系統(tǒng)變量在前用戶變量不一定搶得過。解決是先where java確認(rèn)命中路徑有管理員權(quán)限就調(diào)整系統(tǒng)Path順序沒有權(quán)限就用第3章的臨時(shí)bat把%JAVA_HOME%\bin前置到當(dāng)前窗口IDE里再單獨(dú)指定JDK目錄?,F(xiàn)象三Maven、Tomcat或某個(gè)啟動(dòng)腳本報(bào)找不到j(luò)ava日志里出現(xiàn)...\bin\bin\java.exe。原因是JAVA_HOME寫成了C:\dev\jdk1.8.0_XXX\bin工具又在后面拼了一次\bin也有人把JAVA_HOME寫成了帶引號或結(jié)尾帶分號的形式腳本拼接后路徑不合法。解決是JAVA_HOME只寫頂層目錄去掉引號、分號和尾部反斜杠改完重開終端再啟動(dòng)工具?,F(xiàn)象四解壓到中文、空格或深層目錄后命令行編譯報(bào)錯(cuò)或者腳本報(bào)“系統(tǒng)找不到指定路徑”。原因是舊工具、批處理腳本和部分構(gòu)建插件對空格、中文、長路徑的解析不完整路徑拼接時(shí)被截?cái)?。解決是把JDK目錄移到C:\dev\jdk1.8.0_XXX這類短路徑重新設(shè)置JAVA_HOME和Path不要只改Path不改JAVA_HOME兩個(gè)要一起改。現(xiàn)象五變量設(shè)置完當(dāng)前窗口不生效或者運(yùn)行時(shí)報(bào)Could not find or load main class。原因是環(huán)境變量只對新進(jìn)程生效當(dāng)前cmd還拿著舊值另一個(gè)常見原因是系統(tǒng)里殘留了舊CLASSPATH覆蓋了當(dāng)前目錄。解決是關(guān)掉重開終端用echo %CLASSPATH%檢查必要時(shí)在當(dāng)前窗口執(zhí)行set CLASSPATH.臨時(shí)清掉舊值再運(yùn)行程序。4.2 排錯(cuò)順序和回滾先看路徑再改變量遇到JDK 8相關(guān)報(bào)錯(cuò)我一般按固定順序查不先改項(xiàng)目配置。第一步where java和where javac看命令行實(shí)際命中哪個(gè)目錄第二步echo %JAVA_HOME%看變量是不是頂層目錄第三步用java -XshowSettings:properties -version看java.home確認(rèn)JVM自己認(rèn)為的家目錄在哪里第四步dir %JAVA_HOME%\bin\javac.exe確認(rèn)文件真的存在。四步下來問題基本落在“路徑不對、變量不對、文件不全”三類里。where java where javac echo %JAVA_HOME% java -XshowSettings:properties -version 21 | findstr java.home dir %JAVA_HOME%\bin\javac.exewhere按Path順序列出命中的可執(zhí)行文件能直接看出是否被舊JDK搶占echo %JAVA_HOME%看變量值-XshowSettings:properties讓JVM打印屬性21把標(biāo)準(zhǔn)錯(cuò)誤合并到標(biāo)準(zhǔn)輸出findstr java.home只篩出JVM家目錄最后dir確認(rèn)編譯器文件存在。路徑有空格時(shí)要給%JAVA_HOME%\bin\javac.exe加引號。如果確認(rèn)是變量配錯(cuò)回滾要干凈。用戶變量里的JAVA_HOME可以刪掉Path里把%JAVA_HOME%\bin那一行刪掉如果之前用腳本改過Path先備份再改。不要直接清空整個(gè)Path也不要把系統(tǒng)Path復(fù)制到用戶Path里。下面這段PowerShell只刪用戶變量里的JAVA_HOME和對應(yīng)Path項(xiàng)適合臨時(shí)環(huán)境還原[Environment]::SetEnvironmentVariable(JAVA_HOME, $null, User) $oldPath [Environment]::GetEnvironmentVariable(Path, User) if ($oldPath) { $parts $oldPath -split ; | Where-Object { $_ -and $_ -notlike *\jdk1.8.0_*\bin } [Environment]::SetEnvironmentVariable(Path, ($parts -join ;), User) }第一行把用戶變量JAVA_HOME置空后面讀取用戶Path按分號拆分過濾掉包含jdk1.8.0_且以\bin結(jié)尾的項(xiàng)再寫回。這個(gè)過濾按目錄名匹配執(zhí)行前先確認(rèn)你的路徑符合這個(gè)命名如果不確定先把$oldPath打印出來人工核對別直接跑。5. 驗(yàn)證跑通用HelloWorld和版本命令確認(rèn)JDK 8真的可用裝完不要只看java -version一行輸出就結(jié)束。免安裝版最容易出現(xiàn)“java對了、javac不對”或者“命令行對了、IDE不對”的半成功狀態(tài)。我的驗(yàn)證順序是先看版本和路徑再編譯運(yùn)行一個(gè)最小類最后檢查java.home是否指向解壓目錄。三步都過才算這套JDK 8能交給項(xiàng)目用。5.1 三條命令確認(rèn)版本、路徑和家目錄新開一個(gè)cmd窗口依次執(zhí)行下面幾條命令。第一條看版本第二條看編譯器第三條看實(shí)際命中路徑第四條看JVM家目錄。預(yù)期是版本為1.8where java和where javac都落在%JAVA_HOME%\bin下java.home指向解壓后的jre目錄。java -version javac -version where java where javac java -XshowSettings:properties -version 21 | findstr java.homejava -version輸出運(yùn)行時(shí)版本javac -version輸出編譯器版本兩條都要有缺一條就說明JDK不完整或Path不對。where列出Path中所有命中項(xiàng)第一行才是實(shí)際生效的如果第一行不是自己的目錄回到第4章調(diào)整順序。最后一條里的21不能省因?yàn)榘姹拘畔⒆邩?biāo)準(zhǔn)錯(cuò)誤不合并就篩不到。5.2 編譯運(yùn)行HelloJdk8確認(rèn)編譯鏈完整找一個(gè)空目錄新建HelloJdk8.java類名和文件名保持一致。代碼里同時(shí)打印Java版本和JAVA_HOME方便確認(rèn)運(yùn)行環(huán)境是不是剛配的那套。編譯時(shí)加-encoding UTF-8避免中文注釋在默認(rèn)編碼下報(bào)錯(cuò)。public class HelloJdk8 { public static void main(String[] args) { System.out.println(JDK8 OK: System.getProperty(java.version)); System.out.println(JAVA_HOME: System.getenv(JAVA_HOME)); } }javac -encoding UTF-8 HelloJdk8.java java HelloJdk8javac負(fù)責(zé)把源文件編譯成HelloJdk8.class-encoding UTF-8指定源文件編碼java HelloJdk8啟動(dòng)JVM運(yùn)行這個(gè)類不要帶.class后綴。輸出里應(yīng)該能看到1.8和你的JDK頂層目錄如果JAVA_HOME打印為null說明當(dāng)前窗口沒讀到變量關(guān)掉重開再試。5.3 交付前檢查表檢查項(xiàng)命令通過標(biāo)準(zhǔn)運(yùn)行時(shí)版本java -version顯示1.8編譯器javac -version顯示1.8命中路徑where java第一行在%JAVA_HOME%\binJVM家目錄java -XshowSettings:properties -versionjava.home指向解壓目錄下的jre最小類javac后java HelloJdk8輸出JDK8 OK和JAVA_HOME從那以后我每次拿到j(luò)dk1.8免安裝版壓縮包都先解壓到無空格短目錄重開終端跑一遍java -version、javac -version和HelloJdk8再交給項(xiàng)目用需要多版本時(shí)只用當(dāng)前窗口腳本切換不把系統(tǒng)變量改來改去。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取