Java是我首选的编程语言之一。然而,我经常遇到将我的应用程序分发给最终用户的问题。
给用户一个JAR文件并不总是像我希望的那样方便,而使用Java WebStart需要我维护Web服务器。
如何最好地分发Java应用程序?如果Java应用程序需要向用户计算机安装工件,有没有好的Java安装/打包系统可以使用?
Java是我首选的编程语言之一。然而,我经常遇到将我的应用程序分发给最终用户的问题。
给用户一个JAR文件并不总是像我希望的那样方便,而使用Java WebStart需要我维护Web服务器。
如何最好地分发Java应用程序?如果Java应用程序需要向用户计算机安装工件,有没有好的Java安装/打包系统可以使用?
根据您的发布要求,有多种解决方案。
只需使用一个jar包。这需要用户安装正确的Java版本,否则用户将会得到"类文件格式版本"异常。对于公司内部分发来说,这是可以接受的。
使用launch4j和NSIS等安装程序。这给了您更多的控制权,尽管用户仍然可能会做一些愚蠢的事情,比如卸载Java运行环境。这可能是最流行的方法,也是我目前正在使用的方法。
使用Webstart。这也需要用户安装正确的Java版本,但它更容易上手。我的经验是,在严格受控的内部网络环境中,这是可以接受的,但在更大规模的部署中,由于存在许多奇怪的失败,会变得很痛苦。随着Java 1.7中新的插件技术的出现,这可能会变得更好。
使用Excelsior JET等本地代码编译器,并将其作为可执行文件或打包成安装程序进行分发。虽然昂贵,而且通常会将您绑定到稍旧的Java版本,并且在动态类加载方面存在一些痛点,但它非常适用于需要最小化支持麻烦的大规模部署。
JSmooth 是一个简单的程序,它将您的 jar 文件打包成标准的 Windows 可执行文件。它提供了一个简单的 GUI 界面,让您可以配置所需的 JVM,并将其与应用程序捆绑在一起或者在没有安装时提供下载选项。您可以直接发送 exe 文件,也可以将其与可能的依赖项压缩在一起(或者让程序在启动时从网络上下载额外的依赖项)。它免费使用,就像啤酒和言论一样,这可能是个好事(也可能不是)。
虽然我自己没有使用过NSIS(Nullsoft Scriptable Installer System),但有安装脚本可以检查目标系统是否已安装所需的JRE。
(请注意,我实际上没有使用任何脚本,请不要将其视为认可。)
我需要一种将我的项目及其依赖项打包成单个jar文件的方法。
我使用了Maven2 Assembly插件找到了所需的功能:Maven2 Assembly插件
这似乎重复了one-jar的功能,但无需额外的配置即可启动它。
对于简单的Java应用程序,我喜欢使用Jar文件。这样只需分发一个文件,用户就可以轻松地点击它(在Windows上),或者
java -jar jarname.jar
在我看来,当简单性是主要需求时,jar 是最好的选择。
我开发Eclipse RCP应用程序。通常,启动Eclipse应用程序需要包含可执行的启动器。我将Java虚拟机放在应用程序文件夹中的/jre子目录中,以确保使用正确的Java版本。
然后我们使用Inno Setup打包安装到用户的计算机上。