此问题在此处已有答案:
(51个答案)
3天前关闭。
我创建了Java应用程序并构建了一个jar文件。我可以在我的计算机上运行此jar,但当我试图通过双击jar在其他计算机(未安装JDK)上运行它时,我得到了一个错误:发生Java异常。
当我使用java -jar <filename.jar>
从命令行运行它时,我得到这样的错误:
线程“main”java.lang中出现异常。不支持的类版本错误:MainWindow是由较新版本的Java Runtime(类文件版本62.0)编译的,此版本的Java Runtime只能识别52.0以下的类文件版本
我检查了两台电脑的Java版本。
第一台计算机(安装JDK):
Java版本“18.0.2”2022年7月19日
Java(TM)SE运行时环境(内部版本18.0.2+9-61)
Java HotSpot(TM)64位服务器虚拟机(内部版本18.0.2+9-61,混合模式,共享)
第二台计算机(不带JDK):
Java版本“1.8.0_361”
Java(TM)SE运行时环境(内部版本1.8.0_361-b 09)
Java HotSpot(TM)客户端虚拟机(内部版本25.361-b 09,混合模式,共享)
据我所知,不安装JDK也可以运行一个Jar文件,只要JRE就足够了。但是看起来这个JRE版本太老了?(我不这么认为,但也许我错了。)
总结:
如何在第二台计算机上运行一个jar而不安装JDK?
1条答案
按热度按时间rggaifut1#
JRE这个概念已经过时了- JRE1.8是最后一个。许多供应商(如阿苏尔)都为更新的版本开发了JRE,但它不再是一个受支持的部署平台。
因此,难怪你的最终用户安装了它。JRE1.8是不再支持和非常老,当然太老了,以运行你编译,你编译了最新的Java版本。
例如,您可以让java生成与
javac --release 8 *.java
兼容的JDK 8代码(或者查看您的构建工具文档,了解如何告诉它添加此参数),但这意味着您不能使用此后引入的任何API(而且已经引入了很多),也没有从那时起引入任何Java语言特性(所以,没有X1 M1 N1 X,没有X1 M2 N1 X,没有X1 M3 N1 X字符串,等等)。但是,您的部署模型已过时!
您的部署模型是:
这种模式不再推荐或可用。现在找到JRE相当困难,期望用户拥有它是不合理的。最好的情况是,您可以提供大量的文档,说明他们可以在哪里获得JRE(不再是openjdk.org或java.com!)
这是有原因的:它真的从来没有工作得很好,甲骨文/团队OpenJDK的选择,以摆脱JRE与JDK的分布模式,也许更多的是他们刚刚醒来,并意识到如何在现实世界中一直在部署Java应用程序,而不是他们试图惹恼你改变事情的工作方式。
新的模式包括你将java运行时与你的应用程序一起交付,你负责维护它。
有很多教程介绍如何使用
jlink
,jlink
是其中一个关键部分(所以请在搜索中包含它)。或者,这也不是特别困难,因为这在10年前JRE部署模型还很流行的时候就已经很流行了:你可以把整个JDK和你的jar一起发布,然后做一个简单的安装程序,像launch4j这样的东西可以让你的用户真实的容易地启动它(只需点击EXE)。简单地说,JRE部署模型的问题是:
.jar
文件的对象,这使得安全情况变得相当棘手。与新模型(由于上面列出的旧模型的问题,在它成为官方模型 * 之前 *,许多人已经使用了这个模型)形成对比:
.jar
文件,也不会参与执行除您的应用之外的任何内容,并且大多数JDK安全问题无法被利用,除非应用“参与其中”/可以在应用端修复。这种新模式的缺点是编写安装程序要花很多精力。JRE的一个优点是它们的大小更小,可以用
jlink
复制,jlink
可以制作一个树形抖动JDK(一个JDK,其中包含了特定应用不需要的所有部分)。