分发Java应用程序的最佳方法是什么?[关闭]


115

Java是我选择的编程语言之一。尽管将应用程序分发给最终用户,但我总是遇到问题。

为用户提供JAR并不总是像我想要的那样友好,并且使用Java WebStart要求我维护Web服务器。

分发Java应用程序的最佳方法是什么?如果Java应用程序需要在用户计算机上安装工件,该怎么办?有没有好的Java安装/打包系统?


Java WebStart可以在任何URL之外使用,例如CD或网络驱动器之类的文件系统。当然,它并不能给您太多。注意:eclipse不使用安装程序,您只需解压缩并运行它即可。也许您不需要安装程序。
彼得·劳瑞

1
如今,将这样的Java WebStart应用程序部署到例如Google Application Engine非常简单。
托尔比约恩Ravn的安德森

6
这个问题被关闭很可惜。我不同意“主要基于意见”的理由。提供的答案不是基于观点,而是基于经验。我总是欢迎基于经验的好答案。那些无法从历史中学习的人注定要重蹈覆辙。
bouvierr

您可以使用jlink(由JDK 9引入)来分发Java Apps。它随JDK一起提供。它将为您构建一个专用的JRE。您不需要在客户端计算机上安装Java。
blueray

Answers:


89

有多种解决方案,取决于您的发行要求。

  1. 只是用一个罐子。这假定用户已安装正确的Java版本,否则用户将获得“类文件格式版本”异常。这对于在公司内部进行内部分发是很好的。

  2. 使用launch4j和类似NSIS的安装程序。尽管用户仍然可以执行诸如卸载Java运行时之类的愚蠢工作,但是这给了您更多的控制权。这可能是最流行的方法,也是我目前使用的方法。

  3. 使用Webstart。这还假定用户已安装了正确的Java版本,但是使用起来却容易得多。我的经验是,对于严格控制的Intranet环境而言,这很好,但是对于较大的部署,这会带来麻烦,因为它存在许多奇怪的故障。使用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

我按照您的建议使用了NSIS。我还查看了launch4j。为什么建议同时使用两者?
jacknad 2010年

1
@JackN NSIS是安装程序生成器。Launch4j专门用于简化启动/启动Java程序的过程。它们的功能有些重叠,但是它们针对问题的不同部分。
Noel Grandin 2010年

+1好答案。您有使用Excelsior JET的经验吗?它是否仅支持x86体系结构并且无法加载实时jar库?
KJW 2011年

6

高级安装程序使将Java应用程序打包为Windows可执行文件变得容易,并且设置方式非常灵活。我发现,要将Java应用程序分发到Windows客户端,这是最简单的方法。


5

JSmooth是一个简单的程序,可以将您的jar打包到一个标准的Windows可执行文件中。它带有一个简单的GUI,可让您配置所需的JVM,将其与应用程序捆绑在一起,或者提供一个选项(如果尚未安装的话)进行下载。您可以按原样发送exe文件,也可以使用可能的依赖关系将其压缩(或者让程序在启动时从网上下载额外的依赖关系)。它也是免费的,例如啤酒和演讲,这可能是(或可能不是)一件好事。


4

这取决于目标用户的熟练程度。在大多数情况下,您希望将它们与运行基于Java的应用程序隔离开来。为他们提供执行正确操作的本机安装程序(创建开始菜单项,启动器,向添加/删除程序注册等),并且已经捆绑了Java运行时(因此用户不需要了解或关心它)。我想建议我们的跨平台安装工具, BitRock InstallBuilder。尽管它不是基于Java的,但通常用于打包Java应用程序。它可以轻松地与Ant集成,并且您可以从Unix / Linux / Mac以及其他方式构建Windows安装程序。由于生成的安装程序是本地安装程序,因此它们不需要自解压步骤或目标系统中已经存在JRE,这意味着较小的安装程序并为您省去了很多麻烦。我还想提到我们对开源项目有免费许可证



3

如果它是真正的具有GUI的最终用户应用程序,则应忽略编写程序(Java)时所用的语言,并为每个所选平台使用本机安装程序。Mac人士需要.dmg,而在Windows上则需要.msi或.exe安装程序。在Windows上,我更喜欢NullSoft的NSIS,因为它不像InstallShield或InstallAnywhere那样令人反感。在OSX上,您可以依靠已经存在的JVM。在Windows上,如果需要,您需要检查并安装。Linux的人不会运行Java GUI应用程序,只有少数人会知道如何处理可执行文件.jar。


3
真?linux人们不会运行gui应用程序?那么我想他的程序对他们毫无用处,无法讨论整个讨论。
马特

@Matt为什么您假设原始应用程序是GUI应用程序?我在Linux上安装了许多命令行Java应用程序,尤其是那些以.deb或.rpms形式出现的应用程序。
Ry4an Brase 2012年

1
原始标题为GUI。此外,如果启动了webstart,则可以肯定它是gui应用程序。最后,说Linux用户不使用GUI应用程序是完全不正确的。
马特2012年

我不是说linux人不运行GUI应用程序。我说过他们不会运行“ Java GUI”应用程序,而在NetBeans和Eclipse之外(我在“很少会知道如何处理可执行jar的内容”中进行了介绍),我想不到一个广泛使用的应用程序。 Linux上的Java应用程序(Open Office等是C ++,仅将Java用于插件)。
Ry4an Brase 2012年

听说过SQLDeveloper吗?还是任何Oracle管理工具?全部用Java编码(尽管sqldeveloper最终被捆绑为.exe,但它是Java)
Matt


2

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

我使用Maven2 Assembly插件找到了所需的东西:Maven2 Assembly插件

这似乎可以复制one-jar的功能,但不需要任何其他配置即可使它运行。


1

对于简单的Java应用程序,我喜欢使用Jar's。分发一个用户可以单击的文件非常简单(Windows),或者

java -jar jarname.jar

恕我直言,jar是简单性的主要要求。


在新手上尝试一下,您会发现它不能很好地工作。
rhody

1

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

然后,我们将Inno Setup打包在一起以安装在用户的计算机上。


1

分发Java应用程序的最佳方法是什么?如果Java应用程序需要在用户计算机上安装工件,该怎么办?有没有好的Java安装/打包系统?

根据我的经验(通过评估多个选项),install4j是一个很好的解决方案。它为任何平台创建本机安装程序,专门用于安装Java应用程序。有关详细信息,请参见“见其网站上的功能 ”。

install4j是一种商业工具。特别是如果您的需求相对简单(只需分发应用程序并安装一些构件),则存在许多其他好的选择,包括免费的选择(例如izPack或已经提到的Lauch4j)。但是您要求最好的方法,据我目前的了解,install4j是一种方法,特别是在分发更大或更复杂的Java(EE)应用程序时。


您知道如何强制它在Mac OS上运行JVM 5.0吗?使用Windows,您只需捆绑JRE,但在Mac上,可能已配置了另一个默认JVM。因此,我不确定如何明确强制其使用您想要的特定JVM版本...
Stephane Grenier

@Stephane,我实际上并没有使用install4j创建OS X安装程序,但是考虑到它具有灵活的JRE捆绑/检测选项,我认为这应该不是问题。有关它们的更多信息,请查看此答案中的链接:stackoverflow.com/questions/995881/…
Jonik

由于Mac支持创建Java应用程序捆绑包,因此您可以像这样在info.plist中指定JRE ... <key> JVMVersion </ key> <string> 1.5 + </ string>您可以删除加号以要求特定版本。这就是我的方法,但是我不使用install4j。有很多页面介绍了如何在网络上创建Mac App好友。我也建议您只看一下limewire或vuze(Java应用程序)是如何做到的。您还可以查看它们用于构建应用程序捆绑包和dmg文件的构建脚本,因为它们是开源的!
卡尔

0

最佳答案取决于平台。对于在Windows上进行部署,结合使用one-jarlaunch4j获得了不错的效果。确实花了一些时间来正确设置我的构建环境(主要是Ant脚本),但是现在已经很轻松了。


0

从我的角度来看,高级分发机制是使用诸如ClickOnceWebStart之类的东西。技术之。您只需将版本部署到服务器,当版本发布时,它将自动获取到客户端。Eclipse RCP平台还包含执行WebStart功能的UpdateManager,但还有更多功能。

由于我使用Maven2进行构建,因此部署只是小菜一碟:将已构建的jar复制到服务器上的位置,如果需要,请更新jnlp文件,然后完成。



-2

我将把jar文件以及其他相关的jar,配置文件和文档以及run.bat / run.sh一起压缩。最终用户应该能够将其解压缩到任何位置,并在需要时编辑run.bat(在大多数情况下,它无需编辑即可运行)。如果要在开始菜单,桌面,系统托盘等中创建条目,则安装程序可能会有用。

作为用户,我更喜欢解压缩并运行某种安装方式(请不要选择开始菜单项)。但是,IT行业以外的人员可能会有不同的偏好。因此,如果该应用程序主要面向开发人员zip-run.bat路由,那么可以使用安装程序安装面向公众的应用程序。


这对新手永远都行不通。
rhody
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.