因此,我在Debian PC上编写了一个Java Swing应用程序,并使用IntelliJ将其编译成一个JavaScript文件。然而,当它在其编码的系统上正常运行时,它在其他Windows机器上运行时会导致Java异常。当我在命令行上运行它以显示有关异常的更多细节时,这是输出:
-jar out.jar
Exception in thread "main" 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(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)
字符串
- 请记住,即使使用完全更新的JRE也会发生这种情况。*
显然,在遇到这个问题后,我做了一些研究,我不得不下载最新的JDK到我的Windows系统中,因为很明显Oracle停止分发JRE,所以用最新版本的JDK编译的程序不能在没有安装JDK的计算机上运行。这似乎起作用-安装该JDK后,程序正常运行。
然而,这仍然是一个问题;不是直接对我来说,而是对那些最终可能使用我的软件的人来说。
让我们假设,例如,我做了一个程序来帮助我的一个朋友在他的PC上做一些事情,用Java写的。因为他不是一个开发人员,他没有在他的PC上安装任何JDK,只有一个他以前可能安装过的JRE。所以,为了让他可以运行我的程序,我必须让他在他的计算机上安装最新的JDK,因为每个人都有一天会使用一个程序,我做的将不得不安装它,以及,这似乎不是很实际的我。
所以,总而言之,这整个情况让我非常困惑,尤其是我在互联网上找不到任何东西可以清楚地解释JRE发生了什么-而这正是我试图更好地理解的-JRE到底发生了什么?如果它真的停止了,这是否意味着每个想使用最近编写的Java程序的人都必须安装JDK?或者这只是我缺少的东西?也许在Linux而不是windows中编译与此有关?
此外,我发现有些人说,解决这个问题的方法是将我的JDK降级到“最新”JRE实际支持的版本,但我只是觉得这没有什么意义,因为我会错过很多新的Java功能,有点违背了保持Java语言更新的目的。
所以,有人能为我澄清这一切吗?提前感谢!
2条答案
按热度按时间a0x5cqrl1#
tl;干
详情
Oracle是 Java™ 品牌的所有者、the Java specifications的发行商和Java社区的领导者。
因此,必须阅读的是这份Oracle白色白皮书,2020-05的Java Client Roadmap Update和related blog post。这标志着Oracle从Java Everywhere战略的巨大转变。Oracle不再像过去那样追求将JRE与每个主要操作系统捆绑在一起。
相反,Oracle希望桌面应用程序内部包含JVM。为此,他们创建了Java Platform Module System (JPMS),并制作了jlink和jpackage工具。如果您的应用程序是模块化的,您可以捆绑一个精简的JVM,仅包含特定应用程序实际使用的部分。
所以你可以看到,从这个Angular 来看,对JRE的需求消失了。JRE只是一个没有构建/编译相关工具的JDK。如果应用程序包括JVM,并且用户不再需要将Java安装到桌面计算机上,那么JRE是不必要的。
我记得,你是对的:Oracle不再分发JRE产品,至少不向公众分发。但你应该与他们的销售人员核实一下。但Oracle并不是Java规范实现的唯一来源。
您应该阅读Java Is Still Free 3.0.0 (Oct 2021),由Java社区的支柱撰写。
Oracle只是提供JDK产品的几家供应商之一。这些供应商包括:
他们所有的产品都经过了全面的测试,大部分都是基于Java规范的OpenJDK代码库实现的。
这些供应商中的一些选择提供其产品的JRE版本。此类产品在受控环境中可能很有用,例如企业和教育,其中IT管理部门可能希望在其用户的机器上部署和维护JRE。
如果你决定你真的需要一个JRE,检查所有的JDK供应商的产品。注意他们的许可证条款。
提示:对于 JavaFX 应用程序,您可能会对捆绑OpenJFX实现库的JDK/JRE感兴趣。至少有两个供应商提供其JDK/JRE产品的此类版本:阿苏尔Systems和BellSoft。
olhwl3o22#
这里没有真实的(即无法解决的)问题:
jlink
和jpackager
构建自定义JRE和安装程序,这样用户就不必担心查找和安装JRE或JDK。最后一种情况意味着您将“被挂起”来处理您在应用程序安装程序中分发的嵌入式JRE中的任何安全问题1。
JRE到底发生了什么?
Oracle决定从Java 9开始停止分发JRE。这是旧闻。Oracle给出了这个商业决定的原因。
请参阅Basil's answer以获得关于我们如何到达这里的更长的阐述。一定要阅读他的答案链接到的文档!
如果它真的停止了,这是否意味着每个想使用最近编写的Java程序的人都必须安装JDK?
不。见上文。还有其他方法来处理这个问题。
或者只是我错过了什么?
是的,见上文。
也许在Linux而不是Windows中编译与此有关?
不,这与此无关。但是如果您采用
jlink
+jpackager
方法,则需要为您想要支持的每个平台创建单独的可分发版本。1 - AFAIK这是Oracle试图通过撤回他们的JRE发行版来实现的主要目标。