有人知道如何将特定的 JRE 与已编译的 Java 应用程序打包在一起吗?我目前有一个可执行的 jar 文件,并希望将 JRE 6 Update 31 放入其中。这样无论客户端安装了哪个 JRE 版本,应用程序都可以使用随附的 JRE。该解决方案应该独立于平台工作。
有任何想法吗?提前谢谢了!
有人知道如何将特定的 JRE 与已编译的 Java 应用程序打包在一起吗?我目前有一个可执行的 jar 文件,并希望将 JRE 6 Update 31 放入其中。这样无论客户端安装了哪个 JRE 版本,应用程序都可以使用随附的 JRE。该解决方案应该独立于平台工作。
有任何想法吗?提前谢谢了!
如果您在目标平台上安装了 jre,比如 Windows 64 位,只需将jre
Java 安装文件夹下的所有内容复制到您的发行版中即可。然后创建一个批处理文件以指向您的本地 jre 而不是系统文件。
这是我所做的:
dist
文件夹中jre
文件夹复制到dist\jre-win-1.7.0_04
jre-win-1.7.0_04\bin\java.exe -jar MyProgram.jar
..繁荣,完成!双击批处理文件,它会使用本地 jre 运行您的 jar 文件。为了证明给自己看,卸载系统 jre 并双击批处理文件。仍然有效。
您可以以类似的方式在 Linux 或 OS X 上执行此操作。
我还想指出,这是一种相当普遍的做法,许多 Java 发行版都是这样完成的。所以,不要说你不能或不应该。
但是,有一些警告。这确实使您的发行版更大并且依赖于平台,在我的示例中为 Windows x64。但是,它是可行和可管理的。jre 支持的平台数量有限,猜猜是什么……它们也依赖于平台。
在 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 自动完成的,因此构建这些不同的安装程序并不费力。
对于生产中的商业产品,我们也有同样的情况。我们已经下载了特定版本的 windows 和 linux JRE,并使用IzPack将其与应用程序打包在一起。
如果想要安装应用程序,则必须安装“我们的”JRE,并且无论系统安装了 JRE 还是 JDK,应用程序都由该 JRE 运行。
缺点是:安装程序是为 Windows 或 Linux 制作的,大小约为 50 MB。解压后的模块大小为:
如果我想让它更“独立于平台”,我必须打包两个 JRE,这对于安装程序来说约为 100 MB。它仍然只对两种类型的平台有效(参见 Cthulhu 的回答)。
请注意,我们主要通过 SSH 进行远程安装,并且使用压缩选项将打包时间至少增加了约 10 倍(从几分钟到几十分钟)。
Oracle 提供了一个相当新的解决方案:
上面写着:
独立的应用程序包提供以下好处:
用户使用他们熟悉的安装程序安装应用程序并以通常的方式启动它。
您可以控制应用程序使用的 JRE 的版本。
应用程序可以部署在新系统上,无需安装 JRE。
但是这种方法的一个缺点是:
只能使用 JDK 7 Update 6 或更高版本构建自包含应用程序包。
看看你是否打算分发这个捆绑包(你的应用程序 + JRE),那么有一个实用程序install4J,它是一个强大的多平台 Java 安装程序构建器,可为 Java 应用程序生成本机安装程序和应用程序启动器。
您可以使用 java webstart 部署它,这使您能够下载某个版本的 jre(如果不存在)。不过不知道能不能降级。Java 也必须已经安装。
如果是 NetBeans 平台应用程序,NetBeans 本身可以选择捆绑额外的资源和 JRE。
来源:https ://platform.netbeans.org/tutorials/nbm-nbi.html#bundling-jre
这是直接不可能的。为此,您必须为每个平台下载 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