查詢 Java 程式的 class 檔編譯的 JVM 版本

OpenJDK

最近開始將執行環境的 JVM 8 升到 11,舊專案在編譯的時候如果沒有指定目標版本,就可能在執行時出現 UnsupportedClassVersionError 的錯誤。

Runtime 版本錯誤

Java 專案編譯的 class 檔使用的版本,必須等於或小於執行環境的 JVM 版本,否則會出現錯誤:

Error: LinkageError occurred while loading main class App java.lang.UnsupportedClassVersionError: App has been compiled by a more recent version of the Java Runtime (class file version 60.0), this version of the Java Runtime only recognizes class file versions up to 55.0

發生的原因是 App 編譯成 60.0 版(Java 16),但執行環境的 JVM 為 55.0 版(Java 11)

如何檢查編譯的 class 版本

$ javap -verbose MyApp.class | grep "major"
major version: 55

資料來源:https://fabianlee.org/2018/01/19/java-determining-the-java-version-used-to-compile-a-class-class-file-has-the-wrong-version/

Class 版本對照表

JDK VersionBytecode Version
Java 1.045.0
Java 1.145.3
Java 1.246.0
Java 1.347.0
Java 1.448.0
Java 549.0
Java 650.0
Java 751.0
Java 852.0
Java 953.0
Java 1054.0
Java 1155.0
Java 1256.0
Java 1357.0
Java 1458.0
Java 1559.0
Java 1660.0
Java 1761.0
Java 1862.0

資料來源:https://javaalmanac.io/bytecode/versions/

Gradle 的設定

build.gradle 檔案中可以指定編譯的目標版本,如下:
sourceCompatibility = 1.8
targetCompatibility = 11

compileKotlin {
    kotlinOptions.jvmTarget = "11"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "11"
}
本文網址:https://blog.tonycube.com/2021/07/java-class-version.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。