it-swarm.cn

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

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

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

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

112
Laplie Anderson

根据您的分销要求,有多种解决方案。

  1. 只需用一个罐子。这假定用户安装了正确的Java版本,否则用户将获得“类文件格式版本”异常。这适用于公司内部的内部分发。

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

  3. 使用Webstart。这也假设用户安装了正确的Java版本,但它更容易上手。我的经验是,这对于严格控制的Intranet环境来说很好,但是由于它有许多奇怪的故障,因此会因为更大的部署而变得痛苦。使用Java 1.7中的新插件技术可能会更好。

  4. 使用Excelsior JET之类的本机代码编译器并将其作为可执行文件分发,或将其包装在安装程序中。价格昂贵,而且它通常会将您与Java版本略微相关联,并且动态类加载会有一些麻烦,但它对于需要最大限度地减少支持麻烦的大规模部署非常有效。

85
Noel Grandin
9
Dmitry Leskov

高级安装程序 可以轻松地将Java应用程序打包为Windows可执行文件,并且它的设置方式非常灵活。我发现,为了将Java应用程序分发到Windows客户端,这是最简单的方法。

5
rustyshelf

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

4
stian

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

4
Daniel Lopez

可执行文件是最好的,但它们是平台限制的,即使用gcj: http://gcc.gnu.org/Java/ for linux生成可执行文件并使用launch4j: http://launch4j.sourceforge.net/ 生成Windows可执行文件。要在linux上打包,您可以使用任何rpm或deb打包器。对于win32试试 http://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System

3
zurk

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

3
Ry4an Brase

虽然我自己没有使用 _ nsis _ (Nullsoft Scriptable Installer System),但是有一些安装脚本可以检查目标系统上是否安装了所需的JRE。

许多示例脚本可从 代码示例真实世界安装程序 页面中获得,例如:

(请注意,我实际上并没有使用任何脚本,所以请不要将其作为背书。)

3
coobird

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

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

这似乎与 one-jar 的功能重复,但不需要额外的配置来实现它。

2
David Carlson

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

Java -jar jarname.jar

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

1
jjnguy

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

然后我们用Inno Setup打包安装在用户的机器上。

1
Mario Ortegón

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

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

不过,install4j是一个商业工具。特别是如果您的需求相对简单(仅分发应用程序并安装一些工件),还存在许多其他好的选项,包括免费的(如 izPack 或已经提到的 Lauch4j )。但是你要求 best way,而我目前的知识是install4j,特别是对于分发更大或更复杂的Java(EE)应用程序。

1
Jonik

最佳答案取决于平台。对于在Windows上的部署,我使用 one-jarlaunch4j 的组合获得了良好的结果。确实需要一段时间来正确设置我的构建环境(主要是ant脚本),但现在它相当轻松。

0
qualidafial

从我的角度来看,优越的分发机制是使用像 ClickOnceWebStart technology这样的东西。您只需将版本部署到服务器,它就会在版本发布时自动发送给客户端。此外,Eclipse RCP平台包含可以执行WebStart操作的UpdateManager,还有更多。

由于我使用Maven2进行构建,部署只是一块蛋糕:将构建的jar复制到服务器上的位置,如果需要更新jnlp文件并完成。

0
Petr Macek

installanywhere很好,但很贵 - 我还没有找到(好)免费的

0
Tom