分发我的应用程序jar包及其JRE依赖项

9
我该如何使用JRE分发我的应用程序jar?我通过使用launch4j将可执行的jar转换为exe。
我的应用程序是基于桌面的swing应用程序。我希望它像一个应用程序一样,如果用户没有安装JRE,则可以使用嵌入式JRE使用它。我与应用程序一起提供并使用JRE。卸载应用程序和JRE将像游戏一样卸载。
我知道如果我将预安装的JRE与我的应用程序一起提供,就会发生这种情况。我还在launch4j中看到了JRE选项卡,但我不知道要给哪个路径。我也看到了这个链接,但没有给出明确定义整个过程的步骤或有用的链接。
请给出一些明确的答案。如果您的答案基于launch4j,我会更喜欢。
4个回答

5
你如何分发你的应用程序?你有安装程序吗?
如果你有安装程序,你可以将任何jre与其捆绑,并配置launch4j来使用它。
我为了重新创建你的使用情况所做的事情:
1. 创建一个目录,例如C:\ temp,将我的jdk从C:\ Program Files \ Java \ jdk1.6.0_23复制到C:\ temp \ myownjdk1.6.0_23中进行配置。 2. 在JRE选项卡中,输入“myownjdk1.6.0_23”作为捆绑JRE路径,并配置为“仅使用私有JDK运行时”-虽然我不确定是否真的有必要。 3. 我使用了JDK,但我相信你可以使用JRE做同样的事情。此外,我相信你必须(或可以)为你的捆绑使用相对路径(就像我所做的那样)。
这是我的配置文件:
<launch4jConfig>
  <dontWrapJar>false</dontWrapJar>
  <headerType>gui</headerType>
  <jar>C:\temp\demoapp.jar</jar>
  <outfile>C:\temp\thing.exe</outfile>
  <errTitle></errTitle>
  <cmdLine></cmdLine>
  <chdir></chdir>
  <priority>normal</priority>
  <downloadUrl>http://java.com/download</downloadUrl>
  <supportUrl></supportUrl>
  <customProcName>false</customProcName>
  <stayAlive>false</stayAlive>
  <manifest></manifest>
  <icon></icon>
  <jre>
    <path>myownjdk1.6.0_23</path>
    <minVersion></minVersion>
    <maxVersion></maxVersion>
    <jdkPreference>jdkOnly</jdkPreference>
  </jre>
</launch4jConfig>

我做了同样的事情,它可以工作,但是如果我不将我的Java(JRE)目录与我的test.exe一起提供,它将找不到JRE。我想让它更加动态,就像游戏一样,它将有一个exe文件,如果我点击它,它将提取JRE并给出一些目录选择选项和创建快捷方式选项。使用launch4j可以实现吗?请回复。 - moin
那么这应该是您的安装程序: 让用户将您的包(yourapp.exe、yourapp.jar 和 yourjdk-directory)提取到他选择的目录中。这将相对于yourapp.exe放置JRE。其中之一可能会有所帮助:http://java-source.net/open-source/installer-generatorslaunch4j 的功能是符合要求的,但它不是完整的部署/安装程序包。 - PhilW
是的,你说得对。实际上我想问的是,如果你知道Launch4j或其他开源安装程序中的这个选项,能否给我一些名称。实际上,我想让我的应用程序像游戏或其他软件一样,只需一个exe文件,点击它后会自动提取所有内容并可以使用。 - moin
不确定我是否正确理解您的意思 - 您是想一步提取和运行,还是可以接受一个安装过程,该过程进行安装、提取、创建快捷方式等操作?我现在能想到的最简单的变体是ZIP文件或自解压缩的ZIP文件,它们会提取并(某些SFX会这样做)运行您的应用程序。附言:这可能会满足您的需求http://mark.koli.ch/2009/10/bundle-java-the-jre-and-launch-a-java-app-with-7zip-sfx.html - PhilW
你救了我一命,兄弟。有没有想法为什么只复制JRE文件夹不起作用?我已经尝试了所有可能的路径。非常感谢。 - cjava

2
更好的策略是使用Java Web Start来启动应用程序。使用deployJava.js确保适当的最低版本的Java可用。用户可能已经安装了适当的JRE(因此不需要下载),并且一旦他们选择卸载应用程序,它将在那里供其他Java应用程序和小程序使用。
这虽然不符合您提出的某些要求,但总体上是一个更优越的选择。

请问给我点踩的人可以分享一下为什么他们认为这个答案不可接受吗? - Andrew Thompson
即使不是完美的选择,也应该考虑使用[tag:java-web-start]进行部署。 - trashgod
Java WebStart需要预先安装Java,这看起来像是鸡生蛋的问题,不适合当前的情况。 - Panayotis
@Panayotis,这就是deployJava.js的作用,请注意。另外,参见"is 'don't do it' a valid answer?",其中的结论是“是的,只要你提供一个替代方案”。这个替代方案比任何提出的安装可能过时和不安全的JRE的“解决方案”都要好。 - Andrew Thompson

1

您也可以查看BitRock InstallBuilder

我们为Java提供非常好的支持 - 检测其是否存在以及轻松包含JRE和构建启动器二进制文件。

您可以在此处找到更多信息: http://installbuilder.bitrock.com/docs/installbuilder-userguide/ar01s17.html#_bundling_a_jre

以及Java组件/JRE文件: http://installbuilder.bitrock.com/java/

使用上述链接中的文件,只需在项目中设置几个变量即可使安装程序正常工作。

它不是免费的,但如果您的项目是开源的,您可以申请一个免费的开源许可证,用于创建应用程序的安装程序。

声明:我是BitRock InstallBuilder的开发人员之一,所以我有偏见。


0

我已经创建了自己的launch4j版本,可以自动下载和安装所需的JRE - 无人值守 - (它显示下载进度,但尚未安装进度,并且没有将JRE安装程序下载到其他目录而不是安装程序的工作目录的选项 - 如果有人感兴趣,我可以添加此功能)。只需转到launch4j的“JRE”选项卡即可设置选项。此外,目前仅适用于GUI安装,而非控制台。您可以在此处获取它:https://github.com/maztan/launch4j_auto_jre_download


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接