119

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

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

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

4

15 回答 15

90

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

  1. 只需使用一个罐子。这假定用户安装了正确的 java 版本,否则用户将得到“类文件格式版本”异常。这对于公司内部的内部分发来说很好。

  2. 使用 launch4j 和 NSIS 之类的安装程序。这给了你更多的控制权,尽管用户仍然可以做一些愚蠢的事情,比如卸载 java 运行时。这可能是最流行的方法,也是我目前使用的。

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

  4. 使用 Excelsior JET 等本机代码编译器并将其作为可执行文件分发,或将其包装在安装程序中。昂贵,而且它通常将您与稍旧的 java 版本联系起来,并且动态类加载有些痛苦,但它对于需要最大程度地减少支持麻烦的大规模部署非常有效。

于 2008-09-17T06:45:54.263 回答
6

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

于 2008-09-17T06:45:44.577 回答
5

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

于 2008-09-21T20:10:32.900 回答
4

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

于 2008-09-17T05:00:54.767 回答
4

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

于 2009-01-18T12:07:53.930 回答
3

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

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

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

于 2008-09-19T12:57:49.603 回答
2

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

于 2008-09-17T04:55:34.763 回答
2

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

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

这似乎复制了one-jar的功能,但不需要额外的配置即可。

于 2008-09-26T21:37:14.683 回答
1

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

java -jar jarname.jar

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

于 2008-09-17T04:55:29.367 回答
1

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

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

于 2008-09-17T07:48:16.067 回答
1

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

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

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

于 2009-05-10T09:22:41.047 回答
0

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

于 2008-09-17T04:58:58.577 回答
0

嗯,从我的角度来看,优越的分发机制是使用ClickOnceWebStart技术之类的东西。您只需将版本部署到服务器,并在版本发布时自动发送到客户端。Eclipse RCP 平台还包含 UpdateManager,它可以做 WebStart 的工作,但还有更多。

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

于 2008-09-17T06:24:55.283 回答
0

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

于 2008-09-24T12:53:42.707 回答
-2

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

作为用户,我更喜欢解压缩并运行安装(请不要输入开始菜单)。然而,IT 行业以外的人可能有不同的偏好。因此,如果应用程序主要针对开发人员 zip-run.bat 路线,而面向公众的应用程序可以使用安装程序进行安装。

于 2008-09-17T08:08:53.817 回答