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