我该如何将Java与我的Windows应用程序捆绑在一起?

11
我有一个基于Java的Windows应用程序,希望将Java捆绑安装。安装框架是NSIS。应用程序可执行文件应保证调用捆绑的Java,以避免与系统中安装的其他Javas发生冲突。
如何最好地实现我的目标?我之前没有尝试解决这种问题,并且对Java经验较少,因此不知道有哪些解决方案。如果可行,我认为我更喜欢将Java嵌入应用程序的可执行文件中,否则我猜Java可以与其一起安装(并指向该Java的可执行文件)。
编辑:此项目已通过NSIS生成可执行文件(.exe)。默认情况下,可执行文件将使用系统Java,但如果存在相同目录中的JRE,则它将首选它(即捆绑的Java)。
编辑2:让我想要捆绑Java与此应用程序的场景是,我收到了一个使用32位Java构建的可执行文件,在我的系统上失败(无声)。我的系统有64位Java。
4个回答

0

我们使用的解决方案(几年前,但我仍然认为这是最好的方法)。

找一个可以从jar文件生成exe文件的程序(谷歌是你的朋友,我记不得名字了)。请注意,这个.exe文件仍然需要jre。这只是一种聪明的方式,使一个包含你的.jar文件的exe文件,并自动启动java进程。(这也允许你在你的.exe文件上设置自定义图标)。

你用来开发/编译Java应用程序的Java SDK,还包含一个名为jre的文件夹,其中包含jre的副本。

将此文件夹与安装程序一起包含,以便jre文件夹位于与.exe文件相同的文件夹中。然后,.exe文件将使用包含的jre,而jre将不会安装在计算机上,因此您可以避免任何问题。


请确保您被允许这样做。我不确定所有的JRE都可以自由再分发。 - Mat
即使只是针对JDK的JRE部分,仍然存在一些法律/许可要求。例如,IBM的JRE条款包含以下内容:“(2)除非您的应用程序仅设计运行在通用计算机设备(例如台式机和服务器)上而不是普及设备上,否则您的应用程序必须与JRE Redistributables中标识的其他Redistributables一起重新分发;”,以及关于赔偿和再重新分发限制的其他法律事项。“只需复制这些内容”是错误的建议。 - Mat
@Mat 这是标准的Java 1.6,应该可以自由分发,对吧? - aknuds1
有限制的情况下是允许的。Oracle JRE许可证对您安装的计算机类型也有限制,还有关于不更改其中任何内容的赔偿法律条款和限制... - Mat
实际上,在这个项目中,我们已经通过一个NSIS脚本生成了一个.exe文件(据我所知,我刚加入这个项目,所以我还不是很了解)。我刚刚尝试了您提供的将JDK的JRE与.exe一起打包的建议,看起来是可以工作的。到底是什么机制在起作用呢? - aknuds1
显示剩余3条评论

0

嗯,一个非常简单的解决方案是使用一个简单的Windows批处理文件来启动jar文件,并在其上创建一个快捷方式,这样你就可以得到你喜欢的图标。对于普通用户来说,没有什么实质性的区别 - 毕竟,在Windows上默认是隐藏已知扩展名(这是个糟糕的默认设置,但没办法) - 而对于那些知道exe是什么的人来说,解决方案应该是相当明显的。

这样,你还可以轻松地启动包含的Java程序,或者更好的是提供两个版本,并在ini文件中只需更改一个变量,这真的很好 - 没有人想要或需要过时的、只会带来安全问题的X个不同JRE版本。为了让没有安装Java的人尽可能简单,提供一个包含JRE的版本也是无害的。

一个例子就是weka


我从另一个答案中发现,如果存在的话,应用程序 .exe 可以自动使用随附的 JRE,这意味着我猜测不需要编写包装批处理脚本。 - aknuds1
那么你需要一个启动Java应用程序的exe文件 - 这显然可以正常工作(只需几行C代码即可启动正确的jar文件),但我并不认为这比更简单的脚本有任何优势。 - Voo
这个项目已经生成了一个exe文件,这就是我的意思 :) 所以应该不需要包装脚本。 - aknuds1

0

您确定不想使用计算机JRE吗?在大多数情况下,这是更可取的。 您可以在这里(以及包含的链接)中看到一些安装程序示例,它们检查JRE号码并在必要时(全局)安装它。

如果您真的喜欢在安装程序中包含自己的JRE并始终使用它-有什么阻止您这样做呢?这只是一个关于主程序点如何知道JRE位置并强制使用它的问题。这取决于您如何打包/调用Java程序。通常,这是可行的,也许可以通过一个简单的.bat文件实现-也许可以在安装时创建。


如果使用计算机的JRE,我需要确保它是兼容的。在我的情况下,我发现我的系统Java是64位的,无法启动在另一台开发者机器上构建的可执行文件(可能使用32位Java)。我不知道如何确保系统Java是兼容的,如果不兼容,我仍需捆绑Java。 - aknuds1
使用计算机JRE是最好的选择。我讨厌那些包含自己Java、cygwin等副本的应用程序。它们从不及时打补丁,因此即使修复已发布,它们仍然存在安全漏洞,并且它们占用磁盘空间,这在SSD上仍然是一个大问题。 - Ben Voigt
@Ben Voigt 他们从来不会“按时”修补这些问题吗?根据我的经验,通常他们根本不会修补它们 :/ 然后你就要花时间想办法让它们使用默认的JRE - 或者干脆摆脱有问题的应用程序。特别是在Java中,你必须非常努力地解决不同JRE版本之间的兼容性问题。 - Voo
@Voo:通常下一个应用程序版本会随着 Java 的发布而发布。但这意味着您的 Java 补丁正在等待应用程序更新。我发现大多数这些应用程序可以通过 rd /s jre 然后 mklink /j jre C:\Program Files\Java\jre6 来修复,但如果应用程序开发人员一开始就做对了那就更好了。 - Ben Voigt
@Voo 我不知道让这个应用程序在64位Java下工作会有多容易(它在64位Java下失败,而不是32位),因为我没有参与编写。我想我以前见过一些应用程序在64位Java下无法运行(比如Hudson?),所以我认为这是Java世界中比较常见的问题。 - aknuds1
显示剩余2条评论

0

launch4j 似乎提供了将嵌入的 JRE 捆绑在一起的功能。


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