分发Java应用程序的最佳方式是什么?

119

Java是我首选的编程语言之一。然而,我经常遇到将我的应用程序分发给最终用户的问题。

给用户一个JAR文件并不总是像我希望的那样方便,而使用Java WebStart需要我维护Web服务器。

如何最好地分发Java应用程序?如果Java应用程序需要向用户计算机安装工件,有没有好的Java安装/打包系统可以使用?


Java WebStart可以从任何URL使用,例如像CD或网络驱动器这样的文件系统。尽管它不能提供太多功能。请注意:Eclipse不使用安装程序,您只需解压缩并运行即可。也许您不需要安装程序。 - Peter Lawrey
1
现在将Java WebStart应用程序部署到Google应用引擎等平台非常简单。 - Thorbjørn Ravn Andersen
12
很遗憾这个问题已经关闭。我不同意所述理由“主要基于观点”。提供的答案并非基于观点,而是基于经验。我总是欢迎基于经验的好答案。那些无法从历史中汲取教训的人注定会重蹈覆辙。 - bouvierr
你可以使用JDK 9引入的jlink来分发Java应用程序。它随JDK一起提供。它将为您构建一个专用的JRE。您不需要在客户机上安装Java。 - Ahmad Ismail
15个回答

94

根据您的发布要求,有多种解决方案。

  1. 只需使用一个jar包。这需要用户安装正确的Java版本,否则用户将会得到"类文件格式版本"异常。对于公司内部分发来说,这是可以接受的。

  2. 使用launch4j和NSIS等安装程序。这给了您更多的控制权,尽管用户仍然可能会做一些愚蠢的事情,比如卸载Java运行环境。这可能是最流行的方法,也是我目前正在使用的方法。

  3. 使用Webstart。这也需要用户安装正确的Java版本,但它更容易上手。我的经验是,在严格受控的内部网络环境中,这是可以接受的,但在更大规模的部署中,由于存在许多奇怪的失败,会变得很痛苦。随着Java 1.7中新的插件技术的出现,这可能会变得更好。

  4. 使用Excelsior JET等本地代码编译器,并将其作为可执行文件或打包成安装程序进行分发。虽然昂贵,而且通常会将您绑定到稍旧的Java版本,并且在动态类加载方面存在一些痛点,但它非常适用于需要最小化支持麻烦的大规模部署。


4
关于Webstart的注释:只要用户安装的Java版本不是史前时代的(例如1.2),Webstart就可以被告知下载并安装新版本的Java,以便在您需要的程序版本还不在其计算机上的情况下使用。查看.jnlp文件语法。当然,它仍然会明显地显示您正在使用Java,这可能与您处理的客户不相符。在这种情况下,您应该使用某种“本地”安装程序/文件格式,并尽可能隐藏实现细节。 - Daniel Schneller
10
我不喜欢Webstart。它有太多的Java/Sun品牌。使其正常工作很困难。设置代码签名比其价值更麻烦,用户也无法理解安全性的好处和相关信息。如果您想在用户系统上执行任何操作,则需要支付代码签名证书的费用,以消除可怕的警告。它进行了大量复杂的缓存,可能会导致问题。也许OSGi或即将推出的Java模块将提供类似的自动更新功能。我使用#2的变体,并使用Ant为Mac创建DMG/Packager。 - Cal
2
@JackN NSIS是一个安装程序生成器。Launch4j专门用于简化启动/启动Java程序的过程。它们在功能上有一些重叠,但它们针对问题的不同部分。 - Noel Grandin
太糟糕了,它太贵了... - KJW
@NoelGrandin..但是如何将可写数据库与之绑定呢?有可能吗? - Java Man
显示剩余4条评论

6
Advanced Installer可以轻松地将Java应用程序打包为Windows可执行文件,并且在设置方面非常灵活。我发现,对于向Windows客户端分发Java应用程序,这是最简单的方法。

5

JSmooth 是一个简单的程序,它将您的 jar 文件打包成标准的 Windows 可执行文件。它提供了一个简单的 GUI 界面,让您可以配置所需的 JVM,并将其与应用程序捆绑在一起或者在没有安装时提供下载选项。您可以直接发送 exe 文件,也可以将其与可能的依赖项压缩在一起(或者让程序在启动时从网络上下载额外的依赖项)。它免费使用,就像啤酒和言论一样,这可能是个好事(也可能不是)。


4
这取决于您的目标用户有多复杂。在大多数情况下,您希望让他们与您正在运行的基于Java的应用程序无关。为他们提供一个本地安装程序,执行正确的操作(创建开始菜单条目、启动器、注册添加/删除程序等),并已经捆绑了Java运行时(因此用户不需要知道或关心它)。我想推荐我们的跨平台安装工具BitRock InstallBuilder。虽然它不是基于Java的,但通常用于打包Java应用程序。它可以轻松地与Ant集成,并且您可以从Unix/Linux/Mac构建Windows安装程序,反之亦然。由于生成的安装程序是本地的,因此它们不需要自解压步骤或JRE已经存在于目标系统中,这意味着更小的安装程序,节省了一些麻烦。我还想提到,我们为开源项目提供免费许可证。

4
如果您的应用程序是真正具有GUI界面的终端用户应用程序,则应忽略编写程序所使用的语言(Java),并针对每个选择的平台使用本机安装程序。 Mac用户想要.dmg,而在Windows上,.msi或.exe安装程序是不错的选择。在Windows上,我更喜欢NullSoft的NSIS,因为它比InstallShield或InstallAnywhere更不容易引起反感。在OSX上,您可以确保JVM已经存在。在Windows上,如果必要,您需要检查并为用户安装它。Linux用户不会运行Java GUI应用程序,只有极少数用户知道如何处理可执行的.jar文件。

3
真的吗?Linux用户不运行图形界面应用程序?那么我猜他的程序对他们来说是没用的,整个讨论都无意义了。 - Matt
@Matt,为什么你假设原始应用程序是GUI应用程序?我在Linux上安装了许多命令行Java应用程序,特别是那些以.deb或.rpm形式下载的应用程序。 - Ry4an Brase
1
原标题是GUI。此外,如果已经提到了WebStart,那么它很可能是一个GUI应用程序。最后,说Linux用户不使用GUI应用程序是完全不正确的。 - Matt
是的,那些仍然是像我所举的例子一样的开发工具。在Linux上使用Java GUI是如此的丑陋,如果有其他可用的工具,它就不会被使用。当然这是一种概括,但我所发现的唯一普遍例外是开发工具。 - Ry4an Brase
即使是开发人员,Linux 爱好者也喜欢采用简单而轻松的方式来完成任务... .deb 安装程序可以很容易地满足 Java 的安装需求,通过在安装过程中安装它们的软件包(无论是在线还是绑定版本),而不需要使用任何额外的工具。这就是 DEB 安装程序的工作方式,即开箱即用。此外,还有 AppImage 文件,可以捆绑所有内容并在不安装的情况下运行... - Skaldebane
显示剩余2条评论

3

2

2

我需要一种将我的项目及其依赖项打包成单个jar文件的方法。

我使用了Maven2 Assembly插件找到了所需的功能:Maven2 Assembly插件

这似乎重复了one-jar的功能,但无需额外的配置即可启动它。


1

对于简单的Java应用程序,我喜欢使用Jar文件。这样只需分发一个文件,用户就可以轻松地点击它(在Windows上),或者

java -jar jarname.jar

在我看来,当简单性是主要需求时,jar 是最好的选择。


1
试着对新手使用这个,你会发现它不会很好地工作。 - rhody
那就是几年前Minecraft的分发方式。 - CLOVIS

1

我开发Eclipse RCP应用程序。通常,启动Eclipse应用程序需要包含可执行的启动器。我将Java虚拟机放在应用程序文件夹中的/jre子目录中,以确保使用正确的Java版本。

然后我们使用Inno Setup打包安装到用户的计算机上。


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