如何使用特定的JRE交付我的Java应用程序?

sal*_*inx 36 java

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

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

小智 81

If you have the jre installed on a target platform, say Windows 64 bit, simply copy everything under the jre folder in your Java install and place it in your distro. Then create a batch file to point to your local jre instead of the system one.

Here is what I do:

  • my jar file is in a dist folder
  • copy the system jre folder to dist\jre-win-1.7.0_04
  • create a .bat file with the following line in it jre-win-1.7.0_04\bin\java.exe -jar MyProgram.jar

..boom, done! Double click the batch file and it runs your jar file with the local jre. To prove it to yourself, uninstall your system jre and double click the batch file. Still works.

You can do this on Linux or OS X in an analogous way.

I would also like to point out that this is a fairly common practice and many Java distributions are done like this. So, don't say you can't or shouldn't.

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

  • @DarkCthulhu拥有一个适用于所有平台的安装程序对客户来说效果不佳,他们只对安装程序在其给定平台上运行良好感兴趣,而对所有平台都不一样. (3认同)
  • 将所有内容打包到安装程序中并使其与平台相关比创建一个程序包更糟糕,并将用户指向正确的JRE,**除非**仅针对一个平台.管理许多不同的可执行文件本身就是一个问题. (2认同)

Pau*_*lor 28

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

当然,如果你想为Windows,Linux ectera提供你的应用程序,那么构建安装程序会变得更加复杂,只提供一个可执行的jar会更简单,但这不是客户想要的体验.客户不希望能够下载一个应用程序并在Windows,osx和linux上运行相同的exe.他们很高兴
为每个平台安装不同的安装程序,并期望安装人员以不同的方式工作.

我是这样做的:

OSX:将AppBundler与捆绑的jre一起使用,放入带有DMGCanvas的Dmg.用户只需将应用程序拖动到其/ Application文件夹即可.

Windows:使用带有launch4j包装的捆绑jre的Izpack,因此安装程序可以作为exe运行.

Linux系统:使用的IzPack无捆绑的JRE,为用户的Linux用户喜欢在的正是他们的机器上,但指定的Java最低版本允许控制.理想情况下,我应该为主要的Linux软件包管理器创建软件包,例如rpm,但我认为目前这不值得,因为Linux用户只占我的客户群的一小部分.

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


lin*_*ski 9

我们对生产中的商业产品具有相同的情况.我们已经下载了特定版本的windows和linux JRE,并使用IzPack将其打包到应用程序中.

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

缺点是:安装程序适用于Windows或Linux,大小约为50 MB.解压缩时模块的大小为:

  • app本身~5MB
  • libs~10 MB
  • JRE~90 MB

如果我想让它更"独立于平台",我必须打包两个JRE,安装程序大约为100 MB.它只对两种类型的平台有效(见Cthulhu的回答).

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


Wes*_*Gun 6

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

独立包装

它写道:

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

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

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

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

但这种方法的缺点是:

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

  • 请注意,javapackager,至少高达1.8.0版本的Java(当它被称为javafxpackager时)是错误的并且设计糟糕.我已经解决了一个月的错误和局限. (2认同)

kay*_*ush 5

看看您是否计划分发此捆绑包(您的应用程序+ JRE),然后有一个实用程序install4J,它是一个功能强大的多平台Java安装程序构建器,可为Java应用程序生成本机安装程序和应用程序启动程序.