无法使用 JRE 1 运行 JAR。8_311 使用 Java 17 编译
Cannot run JAR with JRE 1.8_311 compiled with Java 17
我正在使用 IntelliJ 和 OpenJDK 17 创建一个 JavaFX 应用程序。 项目语言级别设置为 17。创建 JAR(构建工件)后,我尝试使用 JRE 1.8.0_311 执行它。当我这样做时,出现此错误:
java.lang.UnsupportedClassVersionError: Main 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 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.access0(URLClassLoader.java:74)
at java.net.URLClassLoader.run(URLClassLoader.java:369)
at java.net.URLClassLoader.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)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main"
根据我的理解,这个错误意味着我的代码是用 Java 17 编译的,但我的 JRE 只能 运行 Java 8 代码。我尝试 运行将 .jar 与 OpenJDK 结合使用,它可以工作。
提前致谢。
是的,您正确理解了问题:为 Java 17 编译的应用程序 不能 运行 Java 8 运行时间。
您有以下选择:
- 将您的 运行 时间更改为 Java 17.
- 如果您的代码库不使用 Java 9 及更高版本的功能,请为 Java 8 编译您的应用程序。
- 在您的应用中捆绑 Java 运行 时间。这样在编译时你有完全的控制权,所以你可以为 Java 17 编译,同时在 Java 17 上编译 运行。
现代 Java 提供 jlink & jpackage tooling to assist with bundling a Java runtime into your app. The Java Platform Module System 可以将 Java 运行 时间缩减为仅应用程序实际使用的部分。
如果您觉得有必要并且有勇气,最先进的方法是使用来自 Oracle 的 GraalVM 技术编译本机应用程序。
您发表评论:
So basically there's not a JRE for java 17?
JRE(Java 运行时环境)正在变得过时,因为 Oracle 不再期望一般最终用户在他们的系统上安装 Java 运行time。 JRE 只是 JDK 的一个子集,删除了一些工具。
如果您如上所述捆绑 Java 运行time,则 JRE 无关紧要,因为新的现代工具将仅包含您的应用程序所需的部分。
您可以从多个供应商中的任何一个获得 Java 17 种实现。这些供应商包括亚马逊、Azul Systems、甲骨文、微软、Adoptium、SAP、BellSoft、Pivotal、Red Hat/IBM、FreeBSD Ports & Packages。有些供应商提供支持,有些则不提供。有的收费,有的不收费。
顺便说一句,另一种选择是在没有捆绑 Java 运行time 且没有 OpenJFX/JavaFX 库的情况下构建您的 JavaFX 应用程序。至少有两家供应商提供了包含 OpenJFX/JavaFX 库的 Java 运行 版本:Azul Systems (ZuluFX) 和 BellSoft (LibericaFX)。这种方法只有在您或您的客户可以控制用户机器的情况下才可行,例如公司环境、学校等。
我建议阅读这两篇白皮书:
- Java Client Roadmap Update,作者 Oracle,2020 年 5 月。
- Java Is Still Free 3.0.0 (Oct 2021) 来自 Java 冠军(Java 社区的支柱)。
我正在使用 IntelliJ 和 OpenJDK 17 创建一个 JavaFX 应用程序。 项目语言级别设置为 17。创建 JAR(构建工件)后,我尝试使用 JRE 1.8.0_311 执行它。当我这样做时,出现此错误:
java.lang.UnsupportedClassVersionError: Main 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 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.access0(URLClassLoader.java:74)
at java.net.URLClassLoader.run(URLClassLoader.java:369)
at java.net.URLClassLoader.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)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main"
根据我的理解,这个错误意味着我的代码是用 Java 17 编译的,但我的 JRE 只能 运行 Java 8 代码。我尝试 运行将 .jar 与 OpenJDK 结合使用,它可以工作。
提前致谢。
是的,您正确理解了问题:为 Java 17 编译的应用程序 不能 运行 Java 8 运行时间。
您有以下选择:
- 将您的 运行 时间更改为 Java 17.
- 如果您的代码库不使用 Java 9 及更高版本的功能,请为 Java 8 编译您的应用程序。
- 在您的应用中捆绑 Java 运行 时间。这样在编译时你有完全的控制权,所以你可以为 Java 17 编译,同时在 Java 17 上编译 运行。
现代 Java 提供 jlink & jpackage tooling to assist with bundling a Java runtime into your app. The Java Platform Module System 可以将 Java 运行 时间缩减为仅应用程序实际使用的部分。
如果您觉得有必要并且有勇气,最先进的方法是使用来自 Oracle 的 GraalVM 技术编译本机应用程序。
您发表评论:
So basically there's not a JRE for java 17?
JRE(Java 运行时环境)正在变得过时,因为 Oracle 不再期望一般最终用户在他们的系统上安装 Java 运行time。 JRE 只是 JDK 的一个子集,删除了一些工具。
如果您如上所述捆绑 Java 运行time,则 JRE 无关紧要,因为新的现代工具将仅包含您的应用程序所需的部分。
您可以从多个供应商中的任何一个获得 Java 17 种实现。这些供应商包括亚马逊、Azul Systems、甲骨文、微软、Adoptium、SAP、BellSoft、Pivotal、Red Hat/IBM、FreeBSD Ports & Packages。有些供应商提供支持,有些则不提供。有的收费,有的不收费。
顺便说一句,另一种选择是在没有捆绑 Java 运行time 且没有 OpenJFX/JavaFX 库的情况下构建您的 JavaFX 应用程序。至少有两家供应商提供了包含 OpenJFX/JavaFX 库的 Java 运行 版本:Azul Systems (ZuluFX) 和 BellSoft (LibericaFX)。这种方法只有在您或您的客户可以控制用户机器的情况下才可行,例如公司环境、学校等。
我建议阅读这两篇白皮书:
- Java Client Roadmap Update,作者 Oracle,2020 年 5 月。
- Java Is Still Free 3.0.0 (Oct 2021) 来自 Java 冠军(Java 社区的支柱)。