如何在 JAR 中捆绑 JRE,以便它可以在没有 Java 的系统上运行?

问题描述 投票:0回答:3

我想将 JRE 捆绑到我的可执行 JAR 中,以便 exe 可以在任何系统上运行。

我尝试过 Launch4j,但这种方法需要我同时提供 JRE 和 exe。根据我的要求,我不应使用安装程序来发布,也不应在客户端计算机上提取/安装 JRE。

如何将 JRE 放入 JAR 中并使用它?

java bundle exe packaging maven-shade-plugin
3个回答
20
投票

您不能将 JRE 放入 JAR 文件中。 (好吧,你可以......但这没有帮助。)

您需要做的是构建并分发安装程序。在 Java 9 之前,创建安装程序的推荐方法是使用商业或开源安装程序生成器。 (谷歌会帮你找到一个。)

也可以将 JRE 嵌入到 ZIP 文件中,如下所述:

ZIP 文件包含 JRE 和应用程序 JAR 以及它需要的其他文件。用户必须解压 ZIP 文件才能安装应用程序。


.. 但它正在复制客户端系统中近 100 MB 的总 JRE。是否可以让JRE轻量化?

其实不然。分发 JRE 最(合法)的轻量级方法是分发 Oracle Java 安装程序。请注意,Java 二进制许可证禁止分发精简版 JRE。如果您想走这条路,请先咨询律师!!


使用嵌入式 JRE 分发 Java 应用程序可以说是一件坏事:

    它会用多个 JRE 填满用户的磁盘。
  • JRE 往往被隐藏/对于正常的安全更新/修补/审核不可见。因此,它们往往会成为安全责任。
  • 您需要定期更新您的可分发文件...以避免将过时/不安全的 JRE 强加给毫无戒心的用户。

从 Java 9 开始,有比在安装程序中包含标准 JRE 更好的解决方案。使用新的

jlink

 实用程序为您的应用程序创建定制的 JRE;请参阅 
https://www.baeldung.com/jlink 获取教程,以及 Oracle Jlink 手册条目

请注意,

jlink

解决了我们上面提到的嵌入式 JRE 的问题。但它
显然让您有责任1以新的 jlink'd 可发行版本的形式向您的用户提供 JVM 安全补丁。

从 Java 14 开始,您可以使用

jpackager

 为您的应用程序创建安装程序或可安装程序。这将包括嵌入式 JRE 和自定义启动器。

最后,您可以考虑使用 GraalVM 为应用程序生成可执行二进制文件。

1 - 事实上,建议和协助客户升级嵌入式 JRE 一直是应用程序供应商/供应商的责任。不幸的是,许多供应商忽视了这一点,导致客户运行带有已知 Java 漏洞的应用程序,而 Sun/Oracle 因供应商的失败而受到不公平的指责。

它确实对我的 launch4j 有用

0
投票
首先创建一个app文件夹 然后打开 launch4j 并输入 jar 文件、输出文件(应位于 app 文件夹中)和图标(请将其放在 app 文件夹中)。然后转到 jre 部分并在捆绑的 jre 路径中输入 jre-{version ur using} 然后输入选项仅使用私有 jdk 运行时然后将最低版本设置为您的 java 版本,然后进行 jdk 安装并复制 bin 和 lib 文件夹然后创建一个jre-{version ur using}文件夹然后将它们粘贴进去。然后将其编译成exe!

迟到总比不到好。我在 pom.xml 中使用了 maven-shade-plugin,如下所示:

-6
投票
<plugin> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>${mainClass}</mainClass> </transformer> </transformers> <!-- If false the shaded artifact takes the normal artifact name, such as, "core-tools-1.0-SNAPSHOT.jar"--> <!-- Meanwhile, another non-shaded version takes the prefix Original, such as "Original-core-tools-1.0-SNAPSHOT.jar"--> <shadedArtifactAttached>false</shadedArtifactAttached> <!-- Exclude signed Manifests from the UberJar --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> <filter> <artifact>*:*</artifact> <includes> <include>sun/misc/**</include> </includes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin>


© www.soinside.com 2019 - 2024. All rights reserved.