无法运行使用 Java 17 编译的 JRE 1.8_311 的 JAR

Fil*_*ppo 0 java javafx java-8 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.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)
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main"
Run Code Online (Sandbox Code Playgroud)

据我了解,此错误意味着我的代码是使用 Java 17 编译的,但我的 JRE 只能运行 Java 8 代码。我尝试使用 OpenJDK 运行 .jar,它可以工作。

提前致谢。

Bas*_*que 13

是的,您正确理解了这个问题:为 Java 17 编译的应用程序无法在 Java 8 运行时上运行

\n

你有选择:

\n
    \n
  • 将运行时更改为 Java 17。
  • \n
  • 如果您的代码库不使用 Java 9 及更高版本的功能,请针对 Java 8 编译您的应用程序。
  • \n
  • 在您的应用程序中捆绑 Java 运行时。这样,您在编译时就拥有完全的控制权,因此您可以针对 Java 17 进行编译,同时也可以在 Java 17 上运行。
  • \n
\n

现代 Java 提供了jlinkjpackage工具来帮助将 Java 运行时捆绑到您的应用程序中。Java平台模块系统可以将 Java 运行时精简为仅由应用程序实际使用的部分。

\n

如果您觉得有必要并且有勇气,最先进的方法是使用Oracle 的GraalVM技术编译本机应用程序。

\n

您评论道:

\n
\n

那么基本上没有适用于 java 17 的 JRE 吗?

\n
\n

JRE(Java 运行时环境)正在成为 pass\xc3\xa9,因为 Oracle 不再期望最终用户一般在其系统上安装 Java 运行时。JRE 只是 JDK 的一个子集,删除了一些工具。

\n

如果您如上所述捆绑 Java 运行时,则 JRE 无关紧要,因为新的现代工具将仅包含您的应用程序所需的部分。

\n

您可以从多个供应商中的任何一个获得 Java 17 实现。这些供应商包括 Amazon、Azul Systems、Oracle、Microsoft、Adoptium、SAP、BellSoft、Pivo​​tal、Red Hat/IBM、FreeBSD Ports & Packages。有些供应商提供支持,有些则不提供。有的收费,有的不收费。

\n

顺便说一句,另一种选择是在不捆绑 Java 运行时且不使用 OpenJFX/JavaFX 库的情况下构建 JavaFX 应用程序。至少有两个供应商提供了包含 OpenJFX/JavaFX 库的 Java 运行时版本:Azul Systems (ZuluFX) 和 BellSoft (LibericaFX)。仅当您或您的客户能够控制用户\xe2\x80\x99 计算机(例如公司环境、学校等)时,此方法才可行。

\n

我建议阅读这两份白皮书:

\n\n