Java 8应用在OpenJDK 1.8.0_352环境下出现JNI版本错误求助
问题描述
几年前开发的JavaFX Java 8应用,在以下Oracle JDK 8环境运行正常:
java version "1.8.0_291" Java(TM) SE Runtime Environment (build 1.8.0_291-b10) Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
但在另一台电脑的Temurin OpenJDK 8环境启动时报错:
openjdk version "1.8.0_352" OpenJDK Runtime Environment (Temurin)(build 1.8.0_352-b08) OpenJDK 64-Bit Server VM (Temurin)(build 25.352-b08, mixed mode)
错误信息
Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: javafx/application/Application has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
堆栈信息
at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:473) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:473) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)
已排查内容
- PATH配置正常:
/usr/lib/jvm/jdk8u352-b08/bin:/bin:/opt/gradle/gradle-7.5.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin - java与javac版本一致,均为1.8.0_352
疑问:是否为Oracle JDK与OpenJDK的差异导致?
问题分析与解决
这个问题不是Oracle JDK和OpenJDK的核心差异导致,本质是JavaFX类版本不匹配:
- 错误中的
class file version 55.0对应Java 11,说明应用依赖的JavaFX库是用Java 11编译的,但当前运行环境是Java 8(对应版本52.0),无法加载高版本编译的类。
为什么Oracle JDK 8下正常?
Oracle JDK 8自带JavaFX(Java 11开始JavaFX被移出JDK成为独立库),开发时应用直接使用了JDK内置的JavaFX类,这些类是Java 8编译的,版本完全匹配。
为什么Temurin OpenJDK 8下报错?
Temurin OpenJDK 8默认不包含JavaFX,应用运行时可能拉取了外部仓库(如Maven/Gradle)中的JavaFX依赖,而这些依赖是基于Java 11+版本编译的,才会触发版本不兼容错误。
解决步骤
- 检查构建依赖:打开项目的Gradle/Maven配置文件,确保引入的JavaFX版本是Java 8兼容的8.x系列。比如Gradle配置示例:
dependencies { implementation 'org.openjfx:javafx-controls:8.0.292' implementation 'org.openjfx:javafx-fxml:8.0.292' // 根据应用需求添加其他JavaFX模块 }
- 替换高版本依赖:如果之前引入了Java 11+的JavaFX依赖,全部替换为Java 8对应的版本。
- 验证类加载路径:用
java -verbose:class命令启动应用,查看javafx/application/Application类的加载来源,确认加载的是Java 8版本的jar包,没有混入高版本库。
内容的提问来源于stack exchange,提问作者Ralph Bloch
相关产品推荐
相关产品推荐

