Java 是我选择的编程语言之一。尽管将我的应用程序分发给最终用户,但我总是遇到问题。
给用户一个 JAR 并不总是像我希望的那样用户友好,使用 Java WebStart 需要我维护一个 Web 服务器。
分发 Java 应用程序的最佳方式是什么?如果 Java 应用程序需要将工件安装到用户的计算机上怎么办?有没有好的 Java 安装/打包系统?
Java 是我选择的编程语言之一。尽管将我的应用程序分发给最终用户,但我总是遇到问题。
给用户一个 JAR 并不总是像我希望的那样用户友好,使用 Java WebStart 需要我维护一个 Web 服务器。
分发 Java 应用程序的最佳方式是什么?如果 Java 应用程序需要将工件安装到用户的计算机上怎么办?有没有好的 Java 安装/打包系统?
有多种解决方案,具体取决于您的分发要求。
只需使用一个罐子。这假定用户安装了正确的 java 版本,否则用户将得到“类文件格式版本”异常。这对于公司内部的内部分发来说很好。
使用 launch4j 和 NSIS 之类的安装程序。这给了你更多的控制权,尽管用户仍然可以做一些愚蠢的事情,比如卸载 java 运行时。这可能是最流行的方法,也是我目前使用的。
使用网络启动。这也假设用户安装了正确的 java 版本,但它更容易上手。我的经验是,这对于严格控制的 Intranet 环境来说很好,但是对于更大的部署来说会变得很痛苦,因为它有一些奇怪的故障。使用 Java 1.7 中的新插件技术可能会变得更好。
使用 Excelsior JET 等本机代码编译器并将其作为可执行文件分发,或将其包装在安装程序中。昂贵,而且它通常将您与稍旧的 java 版本联系起来,并且动态类加载有些痛苦,但它对于需要最大程度地减少支持麻烦的大规模部署非常有效。
高级安装程序可以轻松地将 Java 应用程序打包为 Windows 可执行文件,并且它的设置方式非常灵活。我发现要将 Java 应用程序分发到 Windows 客户端,这是最简单的方法。
JSmooth是一个简单的程序,它可以获取你的 jar 并将其包装在一个标准的 Windows 可执行文件中。它带有一个简单的 GUI,允许您配置所需的 JVM,将其与应用程序捆绑在一起,或者在尚未安装时提供下载它的选项。您可以按原样发送 exe 文件或使用可能的依赖项对其进行压缩(或让程序在启动时从网络下载额外的依赖项)。它也是免费的,就像啤酒和演讲一样,这可能(也可能不是)是一件好事。
如果它是一个真正的具有 GUI 的最终用户应用程序,您应该忽略您编写程序的语言 (Java),并为您选择的每个平台使用本机安装程序。Mac 用户想要一个 .dmg,而在 Windows 上一个 .msi 或 .exe 安装程序是可行的方法。在 Windows 上,我更喜欢 NullSoft 的 NSIS,只是因为它比 InstallShield 或 InstallAnywhere 不那么令人反感。在 OSX 上,您可以指望 JVM 已经存在。在 Windows 上,如有必要,您需要为他们检查并安装它。Linux 人员不会运行 Java GUI 应用程序,而少数会运行可执行 .jar 的人知道如何处理。
这取决于您的目标用户的复杂程度。在大多数情况下,您希望将它们与您正在运行基于 Java 的应用程序的事实隔离开来。给他们一个本机安装程序,它可以做正确的事情(创建开始菜单条目、启动器、注册添加/删除程序等)并且已经捆绑了 Java 运行时(因此用户不需要知道或关心它)。我想推荐我们的跨平台安装工具,BitRock InstallBuilder. 虽然它不是基于 Java 的,但它通常用于打包 Java 应用程序。它可以很容易地与 Ant 集成,您可以从 Unix/Linux/Mac 构建 Windows 安装程序,反之亦然。因为生成的安装程序是本机的,所以它们不需要自解压步骤或 JRE 就已经存在于目标系统中,这意味着安装程序更小,并为您省去了一些麻烦。我还想提一下,我们有开源项目的免费许可证
虽然我自己没有使用过NSIS(Nullsoft Scriptable Installer System),但是有一些安装脚本会检查目标系统上是否安装了所需的 JRE。
(请注意,我实际上并没有使用任何脚本,所以请不要将其视为背书。)
可执行文件是最好的,但它们受平台限制,即使用 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
我需要一种方法将我的项目及其依赖项打包到一个 jar 文件中。
我使用 Maven2 Assembly 插件找到了我需要的东西:Maven2 Assembly plugin
这似乎复制了one-jar的功能,但不需要额外的配置即可。
对于简单的 Java 应用程序,我喜欢使用 Jar's。分发一个用户只需单击即可(Windows)的文件非常简单,或者
java -jar jarname.jar
恕我直言,当简单是主要要求时,jar 是要走的路。
我开发 Eclipse RCP 应用程序。通常,要启动 Eclipse 应用程序,会包含一个可执行启动器。我将 java 虚拟机包含在 /jre 子目录中的应用程序文件夹中,以确保使用正确的 java 版本。
然后我们用 Inno Setup 打包安装在用户的机器上。
分发 Java 应用程序的最佳方式是什么?如果 Java 应用程序需要将工件安装到用户的计算机上怎么办?有没有好的 Java 安装/打包系统?
根据我的经验(通过评估多个选项),install4j是一个很好的解决方案。它为任何平台创建本机安装程序,专门用于安装 Java 应用程序。有关详细信息,请参阅其网站上的“功能”。
不过 install4j 是一个商业工具。特别是如果您的需求相对简单(只需分发应用程序并安装一些工件),还有许多其他不错的选择,包括免费的(如izPack或已经提到的Lauch4j)。但是您要求最好的方法,据我目前的知识, install4j 就是一种,尤其是用于分发更大或更复杂的 Java (EE) 应用程序。
installanywhere 很好但很贵 - 我还没有找到好的免费的
我会将 jar 文件与其他依赖的 jar、配置文件和文档以及 run.bat/run.sh 一起压缩。最终用户应该能够将其解压缩到任何位置并在需要时编辑 run.bat(在大多数情况下它应该在不编辑的情况下运行)。如果您想在开始菜单、桌面、系统托盘等中创建条目,安装程序可能会很有用。
作为用户,我更喜欢解压缩并运行安装(请不要输入开始菜单)。然而,IT 行业以外的人可能有不同的偏好。因此,如果应用程序主要针对开发人员 zip-run.bat 路线,而面向公众的应用程序可以使用安装程序进行安装。