我想将 JRE 捆绑到我的可执行 JAR 中,以便 exe 可以在任何系统上运行。
我尝试过 Launch4j,但这种方法需要我同时提供 JRE 和 exe。根据我的要求,我不应使用安装程序来发布,也不应在客户端计算机上提取/安装 JRE。
如何将 JRE 放入 JAR 中并使用它?
您不能将 JRE 放入 JAR 文件中。 (好吧,你可以......但这没有帮助。)
您需要做的是构建并分发安装程序。在 Java 9 之前,创建安装程序的推荐方法是使用商业或开源安装程序生成器。 (谷歌会帮你找到一个。)
也可以将 JRE 嵌入到 ZIP 文件中,如下所述:
ZIP 文件包含 JRE 和应用程序 JAR 以及它需要的其他文件。用户必须解压 ZIP 文件才能安装应用程序。
.. 但它正在复制客户端系统中近 100 MB 的总 JRE。是否可以让JRE轻量化?
其实不然。分发 JRE 最(合法)的轻量级方法是分发 Oracle Java 安装程序。请注意,Java 二进制许可证禁止分发精简版 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 有用
迟到总比不到好。我在 pom.xml 中使用了 maven-shade-plugin,如下所示:
<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>