Windows環境下JDK的配置及多版本JDK切換的方法記錄


  (這里記錄了筆者了解的關於JDK環境配置的信息,以及針對系統上存在不同版本JDK時所嘗試的解決方案。具體來說,是已安裝 JDK 8 后,又安裝了 JDK 9 時所遇到的問題和嘗試的解決方法。這次記錄以供有同樣問題的人士參考,也希望能給遇到類似問題的人士提供啟發和思路。)  

  筆者最近在PC上安裝了Qt Creator,並按要求為其配置了所需的java 9.0.4環境,結果便發現之前安裝好的軟件包括eclipse、JEB2 等依賴Java運行時環境的軟件出現了無法使用的問題,eclipse直接無法打開,而JEB2打開軟件后大部分功能按鍵無法使用。經過排查和搜索資料后認定這是由於安裝兩個不同版本的JDK后無法滿足上述不同軟件的運行環境需求所產生的問題。

 

名詞解釋(摘自Wiki)

  JDK:Java Development Kit,Java程序開發組件,是針對Java的免費軟件開發工具包( SDK,software Development Kit ),為Java程序的開發提供支持,也目前是最受歡迎的 Java SDK;

  JRE:Java Runtime Environment,Java運行時環境,包含java虛擬機和若干標准函數庫,為Java程序在系統上運行提供支持;  

   Windows環境下的JDK Installer會包含JDK和JRE的安裝選項。一般情況下,會默認安裝上述兩個Java組件。當然,若用戶只需要提供對 Java 運行時環境的支持,則只需要安裝 JRE 以節省系統資源。

 

回顧——如何配置Java環境

  這里為了能夠更好的完成不同版本JDK的配置問題,首先回顧一下第一次為設備設置Java環境時進行的操作( 以JDK 8為例)。

  (1)我們通過 JDK Installer ,選擇了我們需要的組件,一般情況下會選擇默認的設置,也就是 JDK、JRE和公共JRE,並將他們安裝在默認的安裝路徑上,在筆者例子中,是 C:\Program Files\Java\jdk1.8.0_92 目錄;

  (2)我們需要為Java環境設置環境變量,在 開始-> 系統 -> 左側高級系統設置 -> 環境變量 ( 以Win8.1為例 )中設置了若干環境變量

    a) JAVA_HOME :新建一個名為JAVA_HOME的系統變量,存放的是JDK所在的安裝目錄;

    b) CLASSPATH :新建一個名為 CLASSPATH的系統變量,存放的是可用於尋找Java庫的目錄;

    c) Path:在Path變量中,添加了路徑 %JAVA_HOME%\bin 和 %JAVA_HOME%\jre\bin ,這兩項使用JAVA_HOME變量合成了更復雜的路徑,也就是相當於 將C:\Program Files\Java\jdk1.8.0_92目錄下的\bin目錄和 \jre\bin目錄加入了Path變量,這些bin目錄中存放了Java開發(\bin)和運行(\jre\bin)相關的可執行文件

    JAVA_HOME    C:\Program Files\Java\jdk1.8.0_92
    CLASSPATH      .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
    Path            %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

  (注:有資料中表述,Win10環境下,只能為Path添加絕對路徑,不能使用JAVA_HOME變量來合成路徑)

  這里介紹一下Path變量的作用:Path變量中記錄了一系列的文件目錄路徑,當在命令行中執行命令時,如在 cmd 中鍵入 java 時,系統首先在當前目錄下尋找對應名稱的文件,找不到對應的文件時,則會以Path變量中記錄的路徑順序,依次去檢索這些目錄下的文件,直到尋找到與命令名相同的目標文件(一般是可執行文件.exe,如 java.exe),之后系統將命令行參數傳遞給找到的目標文件並執行之,從而實現命令的執行。實際上,許多圖形化界面下的操作最終都換轉化為命令行的方式執行。這也就是需要配置Java環境的原因,簡單的說就是使得系統知道哪里可以找到Java開發(如Java編譯器)和運行(Java虛擬機)所需要的可執行文件。若沒有指定Path路徑,則需要通過指定完整的路徑名來執行文件,如 

    > "C:\Program Files\Java\jdk1.8.0\bin\javac" -version    //沒有添加路徑至Path變量時,需要給出完整的路徑才能執行,且路徑中若包含空格需要用""包含路徑名
    > javac -version                          //添加路徑 C:\Program Files\Java\jdk1.8.0\bin\ 至Path變量后(同樣也需要用""包含帶空格的路徑),可以直接輸入命令,系統會根據Path找到目標文件

  完成上述設置后,每當 java 相關的任務需要執行時,系統就會在 Path 路徑中進行查找(若當前目錄中找不到的話),並由查找到的exe程序執行所要求的任務。

  當安裝一個新版本的 JDK 時,安裝程序會安裝必要的文件,但不會修改上述這些變量的值,故而這些環境變量值是需要重新手動配置的。

 

查看當前系統的Java配置

  Windows環境下,若 java 環境安裝和配置成功完成,則可通過cmd運行得到系統上的 java 環境相關參數。

  (1)通過 javac -version 獲得java編譯器的版本(等同於 jdk 版本,開發需要)

  

  (2)通過 java -version 獲得java虛擬機等相關的版本信息( 等同於 jre版本 ,運行需要)

  

  命令行的運行方式在之前已經給過介紹,系統首先在當前目錄下查找,若找不到,則根據環境變量 Path 中設置的眾多目錄按順序進行查找,直到在某一文件中查找到 javac.exe 文件,則將參數 -version傳遞給該程序,並繼續執行,該程序則會將執行結果輸出。

  從圖示可以看到,筆者PC上由於安裝了兩個不同版本的JDK,且在較新版本的JDK安裝后並沒有正確的配置環境,使得系統在執行上述 javac 和 java 命令時,分別在兩個不同的文件夾中找到了兩個不同版本的可執行文件。這樣(不統一)的JDK環境是可能造成錯誤的。

 

關於公共JRE( public jre )

  在Oracle的文檔中( jdk 8 )找到的關於公共jre的描述:

Private Versus Public JRE

Installing the JDK also installs a private JRE and optionally a public copy. The private JRE is required to run the tools included with the JDK. It has no registry settings and is contained entirely in a jre directory (typically at C:\Program Files\jdk1.8.0\jre) whose location is known only to the JDK. On the other hand, the public JRE can be used by other Java applications, is contained outside the JDK (typically at C:\Program Files\Java\jre1.8.0), is registered with the Windows registry (at HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft), can be removed using Add/Remove Programs, might be registered with browsers, and might have the java.exe file copied to the Windows system directory (which would make it the default system Java platform)

  JDK 8 在安裝JDK時,會在JDK安裝目錄下安裝其私有JRE,該JRE僅用於對JDK的工具提供支持,該JRE沒有注冊表項,只作為JDK安裝目錄下的/jre目錄存在,即不用做為外部應用提供支持。用戶可以選擇是否安裝 public jre ,其為其他的java應用提供運行支持,一般被安裝在一個單獨的目錄下,會有注冊表項,同時其中的java.exe文件可能會被復制到Windows的系統目錄下( 如 C:\Windows\System32 目錄下 )。當然,更簡單的一種做法即為不安裝額外的 public jre,而是直接將 JDK 安裝目錄下的 JRE 用作公共 JRE,即將其路徑加入Path中,這也是之前介紹的配置的做法( 因為公共 JRE 本身就是私有 JRE 的一個拷貝,但是其是有注冊表項的)。

  JDK 9 中,安裝64-bit JDK時會默認安裝公共JRE(也可以取消默認安裝)。同時 JDK 9 中的目錄結構發生了變化(見下)。

  When you install 64-bit JDK, then 64-bit public JRE also gets installed

 

 

不同版本之間Java環境的差異

  由於上述通過cmd獲得Java版本序列號之間存在較大差異,筆者猜測兩個版本之間可能存在較大的變動,所以筆者在JDK 9 Migration Guide 中查看了 JDK 9 與之前版本的變化情況的描述。

  其中與目前筆者所使用JDK相關的差異信息( JDK 8 與 JDK 9 )如下:

  (1) 使用了新的版本字符串格式:JDK 9使用的是 $MAJOR.$MINOR.$SECURITY.$PATH 的版本表示格式(如上圖 java 9.0.4 ),JDK 8中,JDK為 1.8,而JRE為1.8.0,JRE 8 update 92( JDK 8u92 ) 即為 JRE 1.8.0_92;

  (2) JDK 9的目錄結構較之前面版本出現了變化,在JDK 9 之前的版本中,私有JRE是包含在JDK安裝目錄下的 /jre目錄下的,而JDK 9中,私有JRE不再通過單獨的/jre文件夾存放,而是直接分散在JDK目錄下。在安裝JDK 8時,我們在 Path 環境變量中分別加入了 jdk 和 jre 文件夾下的 /bin 文件夾路徑,在JDK 9 環境下這兩個路徑就會有所不同;

  (3) JDK 9版本之前,系統提供的類存放在 /lib/rt.jar 和 /lib/tools.jar文件中,而在 JDK 9版本中,上述兩個文件連同 /lib 文件夾下的一些其他的內部的jar文件以一種更高效的方式組織在一起,存放在 /lib 文件夾下。也就是說,上述兩個文件已經不存在了。回憶一下,我們在安裝JDK 8設置 CLASSPATH 時加入了這兩個文件的路徑;

  (4) 注冊表中的表項發生了變化,在JDK 8中,安裝JRE后,會出現如下的注冊表項

    HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
    HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.8
    HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.8.0_144
    HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment@CurrentVersion=1.8
  //當JDK也被安裝時,添加的注冊表項為上述表項中 Java Runtime Environment 字段被 Java Development Kit 替換后的結果

   而在JDK 9中,安裝JRE后,出現的注冊表項如下

    HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\JRE
    HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\JRE\9
    HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\JRE@CurrentVersion=9  
  //當JDK也被安裝時,添加的注冊表項為上述表項中 JRE 字段被 JDK 替換后的結果

   由於上述兩組注冊表項並不同名,故而若同時安裝了這兩種 JDK 環境,則會同時出現上述兩種注冊表項,

 

 

針對不同JDK版本的解決方法

  1.一個臨時的解決方法:刪除新版本的JDK

  通過Windows自帶的卸載程序可以卸載新安裝的JDK,在 開始-> 控制面板 -> 程序 -> 卸載程序 (Win8.1為例),卸載新安裝的 JDK ( 包括公共JRE等 ),則系統會恢復至單 JDK 版本的狀態,故而原設備上安裝的軟件應該就可以正常運行了,但該方法只能解一時之急,當出現需要依賴新版本的 JDK 的應用時,還是需要安裝新版本的 JDK 以供使用。

 

  2.安裝 JDK 9 ,但選擇不安裝公共 JRE 時

  此時系統中會存在兩個 JDK 目錄(安裝新版本的 JDK 並不會刪除舊版本的 JDK ),根據之前的介紹,配置合適的 JDK 環境簡單的來講就是使得對應的程序能夠尋找到所需的可執行文件( 通過 Path 路徑 ),故而這里需要的即為配置 Path 路徑。由於之前配置 JDK 8 時已經設置好了一部分,故而只需要對其進行修改即可。

    JAVA_8    "C:\Program Files\Java\jdk1.8.0_92\bin"  //新建一個系統變量,存放 JDK 8的安裝路徑
    JAVA_9    "C:\Program Files\Java\jdk-9.0.4\bin"   //新建一個系統變量,存放 JDK 9的安裝路徑
    JAVA_HOME  %JAVA_9%                    //需要某一個JDK版本,則將% %中的變量修改為對應的值即可

  上述修改在重新打開命令行后即可生效,可以通過 java -version 和 javac -version 查看對應的版本是否已經切換。事實上,這里與應用程序啟動和運行相關的是 JRE 而不是 JDK(見定義),而在 JDK 8 中,私有 JRE 就存放在 JDK 的安裝目錄下的,指定了 JDK 目錄后,Path 路徑中已存在 %JAVA_HOME%\jre\bin 條目,即指明了私有 JRE 路徑,從而應用程序可在運行時通過 Path 可以找到該 JRE。而 JDK 9 中,如上所述,已經將私有 JRE 整合在了 JDK 目錄中,故而只需指定對應的 JDK 的可執行目錄,也就是之前已經編輯了的 %JAVA_HOME%\bin 條目,即可獲得對應的 JRE 環境。

  這樣,在需要特定的 JDK/JRE 環境時,只需要將 JAVA_HOME 變量的值修改為對應版本的 JAVA_n 即可。

 

  3.安裝 JDK 9 , 但選擇安裝公共 JRE 時

  選擇安裝公共 JRE 時,則會在新安裝的 JDK 目錄之外多出一個新的 JRE 目錄,該目錄中含有可為應用程序提供運行支持的 JRE 相關的可執行文件。從之前的介紹可以看出,該 JRE 就是一個私有 JRE 的副本,但是其是由注冊表項的。這種情況下使用 java -version 和 javac -version 的結果就是筆者設備之前截圖的情況。此時想要獲得不同版本的 JDK 的支持,一方面,對於 JDK 的支持,則需要依據實際情況修改 JDK 的 Path 路徑,使其指向不同的 JDK 安裝目錄;而對於 JRE 的支持,由於公共 JRE 是有注冊表項的,故而除了需要修改系統變量 Path 中的路徑外,可能還需要修改對應的注冊表項。總的來說,這種方法不是很推薦,因為不安裝公共 JRE 時的配置更簡單,且可以滿足同樣的需求。

  

  4.針對特定的程序的 JDK 配置

  正如之前強調的,安裝新版本的 JDK 時,並不會刪除舊版本的 JDK 文件。更新某個新版本的 JDK ,並將環境變量修改為指向新版本的 JDK 路徑后,即完成了新版本 JDK 的安裝,對於 Java 運行環境有特定需求的應用程序所需要的是 JRE 的支持,當特定應用程序運行時,應用會根據新設置的路徑找到新版本的 JDK 提供的 JRE ,從而出現環境不匹配的問題,而實際上,只要不卸載舊版 JDK ,應用運行所需的 JRE 環境是可以在系統中找到的,故而只需修改特定程序的配置,使其直接使用舊版本的 JRE 即可(而不是根據Path路徑去尋找JRE)。

  如對於eclipse,可編輯其安裝目錄中的 eclipse.ini 文件,在其開始處增加內容 -vm 舊版本JRE的bin目錄路徑 即可。在筆者設備中,即在文件頭部增加以下內容:

    -vm 
    C:\Program Files\Java\jdk1.8.0_92\jre\bin

  即可使得程序能正確找到運行所需要的 JRE 環境,從而能夠成功啟動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM