JDK/JRE/類別版本

May 18, 2022

因為各種原因,你的電腦中可能不只存在一套 JDK,也有可能有多個 JRE!

-version

既然電腦中有可能同時存在多套 JDK/JRE,那麼到底執行了哪一套 JRE?在文字模式下鍵入 javacjava 指令,如果設定了 PATH,會執行 PATH 順序下找到的第一個 javacjava 可執行檔,然而這個可執行檔啟動的是哪套 JDK/JRE?

在執行 javacjava 指令時,可以附帶一個 -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>

分享到 LinkedIn 分享到 Facebook 分享到 Twitter