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

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

给用户一个JAR并不总是如我所愿,并且使用Java WebStart要求我维护一个Web服务器。

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

根据您的分销需求,有多种解决scheme。

  1. 只需使用一个jar子。 这假定用户已经安装了正确的java版本,否则用户将得到“class-file format version”exception。 这对公司内部的分配是很好的。

  2. 使用launch4j和像NSIS这样的安装程序。 这给你更多的控制,尽pipe用户仍然可以做一些愚蠢的东西,如卸载Java运行时。 这可能是最stream行的方法,我目前使用。

  3. 使用Webstart。 这也假定用户已经安装了正确的java版本,但是这样做要容易得多。 我的经验是,这对于严格控制的内部网环境来说是好事,但是由于它有许多奇怪的故障,所以对于更大规模的部署来说是一种痛苦。 Java 1.7中的新插件技术可能会更好。

  4. 使用像Excelsior JET这样的本地代码编译器,并将其作为可执行文件进行分发,或者将其包含在安装程序中。 昂贵的,它通常把你连接到一个稍微老一点的Java版本,dynamic类加载有一些痛苦,但它非常有效的大规模部署,您需要最大限度地减less您的支持麻烦。

将Java转换为EXE – 为什么,何时,何时不是

先进的安装程序可以很容易地将Java应用程序打包为Windows可执行文件,而且它的设置方式非常灵活。 我发现为了将Java应用程序分发给Windows客户端,这是最简单的方法。

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

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

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

如果这是一个真正的具有GUIfunction的最终用户应用程序,则应该忽略其中编写程序的语言(Java),并在每个所选平台上使用本地安装程序。 Mac的人想要一个.dmg,并在Windows上.msi或.exe安装程序是要走的路。 在Windows上,我更喜欢NullSoft的NSIS,因为它不如InstallShield或InstallAnywhere那么令人反感。 在OSX上,你可以指望JVM已经在那里。 在Windows上,如果需要,您需要检查并安装它们。 Linux的人不会运行Java GUI应用程序,less数人会知道如何处理可执行文件.jar。

虽然我自己还没有使用NSIS (Nullsoft脚本安装系统),但是有安装脚本会检查目标系统上是否安装了所需的JRE。

代码示例和真实世界安装程序页面提供了许多示例脚本,例如:

  • 具有自动JRE安装的Java启动程序
  • 简单的Java运行时下载脚本

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

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

我发现我需要使用Maven2 Assembly插件: Maven2 Assembly插件

这似乎重复了one-jar的function,但不需要额外的configuration即可完成。

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

java -jar jarname.jar 

恕我直言,jar子是简单是一个主要要求时的路要走。

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

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

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

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

不过,install4j是一个商业工具。 特别是如果您的需求相对简单(只是分发应用程序并安装一些工件),还有许多其他的好select,包括免费的(如izPack或已经提到的Lauch4j )。 但是你问的是最好的方法,而且就目前的知识而言,install4j就是最好的select,尤其是分发更大或更复杂的Java(EE)应用程序。

最好的答案取决于平台。 对于在Windows上部署,我使用one-jar和launch4j的组合已经有了很好的结果。 确实需要一点时间来build立我的构build环境(大部分是ant脚本),但现在这是相当痛苦的。

那么从我的angular度来看,出色的分发机制就是使用ClickOnce或WebStart技术。 您只需将版本部署到服务器,并在发布版本时自动将其发送到客户端。 此外,Eclipse RCP平台还包含UpdateManager,可以完成WebStart的function,但也有更多的function。

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

installanywhere是好的,但昂贵的 – 我还没有find(好)免费的

我会压缩jar文件以及其他依赖jar,configuration文件和文档以及run.bat / run.sh。 最终用户应该能够将其解压缩到任何位置,并在需要时编辑run.bat(在大多数情况下,它应该运行而不需要编辑)。 如果您想要在开始菜单,桌面,系统托盘等中创build条目,安装程序可能会很有用。

作为用户,我更喜欢解压并运行一种安装(请不要启动菜单条目)。 但是IT行业以外的人可能会有不同的偏好。 因此,如果应用程序主要针对开发人员,则可以使用安装程序安装zip-run.bat路由和一般公众应用程序。