39

有人知道如何将特定的 JRE 与已编译的 Java 应用程序打包在一起吗?我目前有一个可执行的 jar 文件,并希望将 JRE 6 Update 31 放入其中。这样无论客户端安装了哪个 JRE 版本,应用程序都可以使用随附的 JRE。该解决方案应该独立于平台工作。

有任何想法吗?提前谢谢了!

4

9 回答 9

86

如果您在目标平台上安装了 jre,比如 Windows 64 位,只需将jreJava 安装文件夹下的所有内容复制到您的发行版中即可。然后创建一个批处理文件以指向您的本地 jre 而不是系统文件。

这是我所做的:

  • 我的 jar 文件在一个dist文件夹中
  • 将系统jre文件夹复制到dist\jre-win-1.7.0_04
  • 创建一个 .bat 文件,其中包含以下行 jre-win-1.7.0_04\bin\java.exe -jar MyProgram.jar

..繁荣,完成!双击批处理文件,它会使用本地 jre 运行您的 jar 文件。为了证明给自己看,卸载系统 jre 并双击批处理文件。仍然有效。

您可以以类似的方式在 Linux 或 OS X 上执行此操作。

我还想指出,这是一种相当普遍的做法,许多 Java 发行版都是这样完成的。所以,不要说你不能或不应该。

但是,有一些警告。这确实使您的发行版更大并且依赖于平台,在我的示例中为 Windows x64。但是,它是可行和可管理的。jre 支持的平台数量有限,猜猜是什么……它们也依赖于平台。

于 2012-11-16T20:15:00.607 回答
31

在 OSX 上,他们正在从提供 Java 的 Apple 转向提供 Java 的 Oracle,这也意味着 Java 不会安装在全新安装的 OSX 上。Oracle 提供了一个打包 Java 安装的工具,他们强烈建议您在安装过程中提供 jre。这样做的好处是客户不必安装额外的包来运行您的应用程序,并且您可以针对您的正确 Java 运行时测试您的应用程序,并确保在发货前没有不兼容的情况。缺点是构建安装程序稍微复杂一些,并且您的下载大小更大。

当然,如果您想为 Windows、Linux 等提供应用程序,构建安装程序会变得更加复杂,并且仅提供可执行 jar 会简单得多,但这不是客户想要的体验。客户不希望能够下载一个应用程序并在 windows、osx 和 linux 上运行相同的 exe。他们很高兴
每个平台都有不同的安装程序,并希望安装程序以不同的方式工作。

我就是这样做的:

OSX:将 AppBundler 与捆绑的 jre 一起使用,使用 DMGCanvas 放到 Dmg 上。用户只需将应用程序拖到他们的 /Application 文件夹即可。

Windows:将 Izpack 与用 launch4j 打包的捆绑 jre 一起使用,以便安装程序可以作为 exe 运行。

Linux:使用没有捆绑 jre 的 Izpack,因为用户 linux 用户喜欢控制他们机器上的确切内容,但指定允许的最低 Java 版本。理想情况下,我应该为主要的 Linux 包管理器(如 rpm)创建包,但我认为目前这不值得付出努力,因为 Linux 用户只占我客户群的一小部分。

大多数安装都是使用 Maven 和 Ant 自动完成的,因此构建这些不同的安装程序并不费力。

于 2012-12-14T10:04:54.103 回答
9

对于生产中的商业产品,我们也有同样的情况。我们已经下载了特定版本的 windows 和 linux JRE,并使用IzPack将其与应用程序打包在一起。

如果想要安装应用程序,则必须安装“我们的”JRE,并且无论系统安装了 JRE 还是 JDK,应用程序都由该 JRE 运行。

缺点是:安装程序是为 Windows 或 Linux 制作的,大小约为 50 MB。解压后的模块大小为:

  • 应用程序本身 ~ 5MB
  • 库 ~10 MB
  • JRE ~90 MB

如果我想让它更“独立于平台”,我必须打包两个 JRE,这对于安装程序来说约为 100 MB。它仍然只对两种类型的平台有效(参见 Cthulhu 的回答)。

请注意,我们主要通过 SSH 进行远程安装,并且使用压缩选项将打包时间至少增加了约 10 倍(从几分钟到几十分钟)。

于 2012-10-24T09:06:47.497 回答
6

Oracle 提供了一个相当新的解决方案:

独立包装

上面写着:

独立的应用程序包提供以下好处:

  • 用户使用他们熟悉的安装程序安装应用程序并以通常的方式启动它。

  • 您可以控制应用程序使用的 JRE 的版本。

  • 应用程序可以部署在新系统上,无需安装 JRE。

但是这种方法的一个缺点是:

只能使用 JDK 7 Update 6 或更高版本构建自包含应用程序包。

于 2017-07-28T13:47:43.793 回答
5

看看你是否打算分发这个捆绑包(你的应用程序 + JRE),那么有一个实用程序install4J,它是一个强大的多平台 Java 安装程序构建器,可为 Java 应用程序生成本机安装程序和应用程序启动器。

于 2012-10-24T08:54:26.043 回答
3

您可以使用 java webstart 部署它,这使您能够下载某个版本的 jre(如果不存在)。不过不知道能不能降级。Java 也必须已经安装。

于 2012-10-24T08:53:49.397 回答
2

您需要使用放置在 JAR 文件旁边的 JRE 的特定于平台的启动器。当然,您可以使用批处理文件和 shell 脚本来执行此操作,但还有更专业的解决方案可以创建本机启动器,例如install4j。(免责声明:我公司开发 install4j)。免费的解决方案是izpack

于 2012-10-24T08:53:00.543 回答
1

如果是 NetBeans 平台应用程序,NetBeans 本身可以选择捆绑额外的资源和 JRE。

来源:https ://platform.netbeans.org/tutorials/nbm-nbi.html#bundling-jre

于 2017-11-29T21:08:59.797 回答
0

这是直接不可能的。为此,您必须为每个平台下载 VM。对于 Windows,将 JRE 复制到目录和 jar 并通过 shell 脚本调用分布式 JVM。但这太难了,Cthulhu 描述的解决方案是最好的,即检查版本并指向网页。

但是,您可能会检查一些。

JSmooth - http://jsmooth.sourceforge.net/

Jar2Exe - http://transfer2pc.weebly.com/1/post/2011/10/jar2exe-converter-11-gui.html

于 2012-10-24T09:03:36.720 回答