JDK/JRE/類別版本
May 18, 2022因為各種原因,你的電腦中可能不只存在一套 JDK,也有可能有多個 JRE!
-version
既然電腦中有可能同時存在多套 JDK/JRE,那麼到底執行了哪一套 JRE?在文字模式下鍵入 javac
、java
指令,如果設定了 PATH
,會執行 PATH
順序下找到的第一個 javac
、java
可執行檔,然而這個可執行檔啟動的是哪套 JDK/JRE?
在執行 javac
、java
指令時,可以附帶一個 -version
引數,這可以顯示 JRE 版本,例如:
C:\workspace>javac -version
javac 17
C:\workspace>java -version
java version "17" 2021-09-14 LTS
Java(TM) SE Runtime Environment (build 17+35-LTS-2724)
Java HotSpot(TM) 64-Bit Server VM (build 17+35-LTS-2724, mixed mode, sharing)
C:\workspace>
如果有個需求是切換 JDK/JRE,文字模式下必須設定 PATH
順序中,找到的第一個 JDK/JRE 的 bin 資料夾,就決定了想使用的 JDK/JRE。
類別版本
如果使用新版本 JDK 編譯出位元碼檔案,在舊版本 JRE 執行,可能會發生以下的錯誤訊息:
C:\workspace>javac -version
javac 17
C:\workspace>javac HelloWorld.java
C:\workspace>set PATH=C:\Program Files\Java\jdk-11\bin
C:\workspace>java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
C:\workspace>java HelloWorld
Error: LinkageError occurred while loading main class HelloWorld
java.lang.UnsupportedClassVersionError: HelloWorld has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
C:\workspace>
結果出現 UnsupportedClassVersionError
,並指出這個位元碼的主版本號與次版本號(major.minor)為 61.0,然而 JDK11 只支援至 55.0。
編譯器會在位元碼檔案中標示主版本號與次版本號,不同的版本號,位元碼檔案格式可能有所不同。JVM 在載入位元碼檔案後,會確認其版本號是否在可接受的範圍,否則就不會處理該位元碼檔案。
可以使用 JDK 工具程式 javap
加上 -v
或 -verbose
引數,確認位元碼檔案的版本號:
C:\workspace>javap -v HelloWorld
Classfile /C:/workspace/HelloWorld.class
Last modified 2022年5月19日; size 425 bytes
MD5 checksum cc7d6f4e0ad8852173cab31134ff4e68
Compiled from "HelloWorld.java"
public class HelloWorld
minor version: 0
major version: 61
...略
在編譯的時候,若是 Java SE 9 以後的版本,可以使用 --release
引數來指定位元碼檔案的版本,例如:
C:\workspace>javac -version
javac 17
C:\workspace>javac --release 11 HelloWorld.java
C:\workspace>set PATH=C:\Program Files\Java\jdk-11\bin
C:\workspace>java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
C:\workspace>java HelloWorld
Hello, World
C:\workspace>