打包Java软件在Windows上运行的最佳方式是什么?

打包Java软件在Windows上运行的最佳方式是什么? 是否有写入.BAT文件的标准,可以发现机器上最新安装的JRE? 有没有任何Maven插件? 可执行Jar文件的处理是什么?

毫无疑问,我建议您使用Java Web Start,因为它允许您轻松控制所使用的版本(到目前为止更容易使用的更新机制)。

取决于你需要什么。

我们发现使用One-JAR + JSmooth提供了非常好的用户体验,因为它允许我们分发一个可以放在用户系统上的任何地方的EXE文件,而不是安装二进制文件,这需要安装和卸载等等等等。JSMooth检查是否存在适当的Java运行时,如果没有发现,则重定向到官方下载站点。

One-jar的原因是你通常需要使用最好分开的库jar,但是JSmooth只允许一个jar文件。

此外,One-Jar SDK和JSmooth可以在不绑定Windows的情况下编写脚本,因此我们可以在运行在Linux上的Hudson引擎上构建新版本。

在过去,我使用了像launchForJ这样的java安装包。 但是,很多这些软件包使用Java,因此您可能需要使用本地windows代码编写的批处理或简单可执行文件,以快速检查是否已安装Java,然后运行安装程序。

由于Java在安装过程中使用了系统变量,因此应该能够以这种方式检查所需版本(或更高版本)是否存在。

标准的方法是使用Java Web Start 。

使用Java Web Start技术,独立的Java软件应用程序可以通过网络单击进行部署。 Java Web Start确保将部署最新版本的应用程序,以及正确版本的Java Runtime Environment(JRE)

Maven有一个Webstart Maven插件来帮助构建可以通过Web Start部署的应用程序包。

另一种解决方案是使用跨平台的安装程序生成器来生成安装程序。 我个人喜欢IzPack (我认为JSmooth非常相似,但我有更多的经验与IzPack),如果你是专门针对Windows平台,你可以使用IzPack来构建本地Windows Installer与IzPack本地启动器 :

当目标系统没有安装JRE时,IzPack仍然会出现问题。 用户需要先安装它,然后运行IzPack安装程序。 这对于Linux或者BSD用户来说不是问题,因为他们通常很熟练,而且他们知道如何通过手动或者使用包装系统(RPM,DEB,ebuild,ports等)来完成这个任务。 同样,Mac OS X用户也不会有太多的问题,因为它可以在操作系统中使用。 但是,由于必须安装JRE,因此Windows平台上的情况更为复杂。 更糟糕的是,有时可能会在有时会出现混乱的情况下安装多个实例。

IzPack本机启动器试图解决这个问题。 它是一个C ++原生应用程序,可以在非常宽松的MIT许可证下使用,并使用wxWidgets作为GUI。 因此它是跨平台的(对于历史学家来说:它最初是在FreeBSD机器上开发的),但是大多数人在Windows上都需要它。 它使用一个简单的配置文件,并首先检查一个JRE。 如果没有找到,则会弹出一个对话框让用户在以下选项中进行选择:

  • 手动指定JRE位置
  • 从互联网下载一个
  • 安装包装商提供的一个(如果有的话)。

IzPack还提供了一个Maven插件 。 值得支票。