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

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

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

What's the best way to distribute a Java application? What if the Java application needs to install artifacts to the user's computer? Are there any good Java installation/packaging systems out there?

67212 次浏览

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

java -jar jarname.jar

恕我直言,当简单是一个主要的要求时,jar 是一种方法。

可执行文件是最好的,但它们受平台的限制,例如,在 linux 中使用 gcj: http://gcc.gnu.org/java/生成可执行文件,在 windows 中使用 launch4j: http://launch4j.sourceforge.net/生成可执行文件。 要在 linux 上打包,你可以使用任何 rpm 或 deb 打包器

The best answer depends on the platform. For deployment on Windows, I have had good results using a combination of 一罐 and Launch4j. It did take a little while to set up my build environment properly (ant scripts, mostly) but now it's fairly painless.

如果它是一个真正的具有 GUI 的终端用户应用程序,那么您应该忽略编写程序时使用的语言(Java) ,并为您选择的每个平台使用本机安装程序。Mac 的人想要。和窗口。Msi 或 a。Exe 安装程序是正确的选择。在 Windows 上,我更喜欢 NullSoft 的 NSIS,因为它比 InstallShield 或 InstallAnywhere 更不容易引起反感。在 OSX 上,您可以指望 JVM 已经在那里了。在 Windows 上,如果需要的话,你需要检查并安装它。Linux 用户不会运行 JavaGUI 应用程序,少数会运行的人知道如何处理可执行文件。罐子。

从我的观点来看,优越的分配机制是使用类似于 点击一次WebStart技术的东西。您只需将版本部署到服务器,当版本发布时,它就会自动发送到客户端。 此外,Eclipse RCP 平台还包含 UpdateManager,它可以完成 WebStart 所做的工作,但也可以完成更多工作。

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

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

根据您的发行需求,有各种各样的解决方案。

  1. Just use a jar. This assumes that the user has the the correct java version installed, otherwise the user will get "class-file format version" exceptions. This is fine for internal distribution inside a company.

  2. Use launch4j and an installer like NSIS. This gives you a lot more control, although the user can still do stupid stuff like un-installing the java runtime. This is probably the most popular approach, and what I currently use.

  3. 使用 Webstart。这也假设用户已经安装了正确的 Java 版本,但是这样做要容易得多。我的经验是,对于受到严格控制的内部网环境来说,这样做没有问题,但是对于更大的部署来说,这就成了一种痛苦,因为它有许多奇怪的失败。随着 Java 1.7中新的插件技术的发展,它可能会变得更好。

  4. 使用像 ExcelsiorJET 这样的本机代码编译器并作为可执行文件分发,或者将其包装在安装程序中。昂贵,并且它通常将您绑定到稍微老一点的 Java 版本,并且动态类加载有一些痛苦,但是它对于大规模部署非常有效,您需要尽量减少支持方面的麻烦。

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

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

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

作为一个用户,我更喜欢解压缩和运行类型的安装(没有开始菜单项请)。然而,IT 行业之外的人可能有不同的偏好。因此,如果应用程序主要面向开发人员 zip-run.bat 路由,那么可以使用安装程序安装面向公众的应用程序。

Although I haven't used NSIS (Nullsoft Scriptable Installer System) myself, there are install scripts that will check whether or not the required JRE is installed on the target system.

许多示例脚本可以从 代码示例Real World Installers页面获得,例如:

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

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

installanywhere is good but expensive one - i have not found (as) good free one

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

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

这似乎重复了 一罐的功能,但是不需要额外的配置就可以启动它。

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

什么是最好的方式来分发一个 Java 应用程序? 如果 Java 应用程序需要安装工件 用户的电脑 良好的 Java 安装/打包 systems out there?

根据我的经验(从 评估一些选择) ,Install4j是一个很好的解决方案。它为任何平台创建本地安装程序,专门用于安装 Java 应用程序。有关详情,请参阅 特征的网页。

Install4j 是一个商业工具。特别是如果您的需求相对简单(只需发布一个应用程序并安装一些工件) ,那么还有许多其他好的选项,包括免费的选项(如 伊兹帕克或者已经提到的 Lauch4j)。但是您要求使用 best方式,而且就我目前所知,install4j 是一种方式,特别是用于发布更大或更复杂的 Java (EE)应用程序。