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

sdnqo3pr  于 2023-01-07  发布在  Java
关注(0)|答案(3)|浏览(185)

我想在我的可执行JAR中捆绑一个JRE,这样exe就可以在任何系统上运行。
我试过Launch4j,但这种方法要求我同时提供JRE和exe。根据我的要求,我不应该使用安装程序来提供,也不应该在客户机上提取/安装JRE。
我如何把JRE放入JAR中并使用它?

h22fl7wq

h22fl7wq1#

你不能把JRE放在JAR文件里(你可以......但是没有用)。
你需要做的是构建和分发一个安装程序。在Java 9之前,推荐的创建安装程序的方法是使用商业或开源的安装程序生成器。(Google会帮你找到一个。)
也可以将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 manual entry
注意,jlink解决了我们上面提到的嵌入式JRE的问题,但是它明确地使您有责任1以新的jlink发行版的形式向您的用户提供JVM安全补丁。
1 -实际上,应用程序供应商/厂商有责任为客户升级嵌入式JRE提供建议和帮助。不幸的是,许多厂商忽视了这一点,导致客户运行的应用程序带有已知的Java漏洞,Sun/Oracle受到指责......不公平......因为厂商的失败。

fwzugrvs

fwzugrvs2#

它确实对我的launch 4j起作用了
首先创建一个应用程序文件夹,然后打开launch 4j并键入jar文件、输出文件(应位于应用程序文件夹中),以及图标(请在应用程序文件夹中)。然后转到JRE部分,在捆绑的JRE路径中键入JRE-{版本UR使用},然后放置选项仅使用私有JDK运行时,然后将最小版本放置到UR Java版本,然后去jdk安装,复制bin和lib文件夹,然后创建一个jre-{version ur using}文件夹,然后粘贴这些文件夹,然后编译成exe!

kuhbmx9i

kuhbmx9i3#

迟到总比不来好。我在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>

相关问题