Java JDK,编译器版本与 Java 运行时不兼容

Java JDK,编译器版本与 Java 运行时不兼容

我尝试用 编译一个名为的简单 Hello world javac,但是当我使用命令“java Hello”时,JVM 似乎无法读取字节码。

‘java Hello’的输出:

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: Hello has been compiled by a more recent version of the Java Runtime (class file version 57.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(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

答案1

错误信息(希望)相当清楚:

java.lang.UnsupportedClassVersionError:

Hello 已由较新版本的 Java Runtime(类文件版本 57.0)编译,此版本的 Java Runtime 仅识别最高 52.0 的类文件版本

您使用的编译器生成的 Java 运行时 (JRE) 无法理解的 Java 字节码,因为 JRE 太旧(特别是比您用于编译的 JDK 更旧)。

当编译 Java 代码时,编译器会产生 Java 字节码。Java 字节码有不同版本(每次发布新 Java 版本时,通常都会引入新版本的字节码),如果版本太新,旧的 JRE 就无法运行字节码。

有两种方法可以解决这个问题:

1)使用 -target 选项

原则上,你可以通过告诉编译器为较旧的 JRE 进行编译来解决这个问题 - 这是使用选项完成-targetjavac(例如参见Java 9 的 javac 文档)。

例如,

javac -target 1.8 HelloWorld.java

将从 Java 1.8(又名 Java 8)编译 JRE 的字节码。这将解决您收到的错误,因为错误消息中提到的字节码版本 52 对应于 Java 8(有关将字节码版本映射到 Java 版本的表格,请参阅 Wikipedia 页面Java 类文件)。

请注意,虽然这种方法可以解决您遇到的错误,但您可能会遇到与您编译的 Java API 相关的其他问题 - 您必须使用选项javac-bootclasspath或者-release如果您使用的是 Java 9 或更新版本。

2)使用匹配的JRE/JDK

如果解决方案 1) 听起来很复杂,那是因为它确实很复杂:-)。

务实的解决方案,特别是如果你处于学习阶段,就是使用匹配版本的虚拟机/JRE 和编译器,最简单的方法是使用随 JDK 下载一起安装的 JRE(即使用javajavac来自同一个下载)。

这实际上是您下载并安装 JDK 后默认发生的情况,因此您收到的错误可能意味着您在某处安装了第二个(第三个?)JRE。

如果可行,只需卸载所有 JRE 和 JDK,只留下您要使用的那个 JDK。如果您需要同时使用多个 JRE,请确保您的配置(PATH 变量、IDE 配置等)都指向同一个 JDK。这样可以避免这些问题。

请注意,某些 IDE(例如 Eclipse)具有内置编译器 - 您可能需要单独配置它,以匹配您安装的 JDK 版本,或者最好使用 IDE 推荐的 JDK 版本。

相关内容