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

时间:2012-10-24 08:46:28

标签: java

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

有什么想法吗?非常感谢提前!

10 个答案:

答案 0 :(得分:80)

如果您在目标平台上安装了jre,比如说Windows 64位,只需复制Java安装中jre文件夹下的所有内容并将其放在发行版中。然后创建一个批处理文件以指向您的本地jre而不是系统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支持有限数量的平台,并猜测它们也是平台依赖的。

答案 1 :(得分: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:使用没有捆绑jre的Izpack,因为用户linux用户喜欢控制他们机器上的确切内容,但是指定允许的最小Java版本。理想情况下,我应该为主要的Linux软件包管理器创建软件包,例如rpm,但我认为目前这不值得,因为Linux用户只占我的客户群的一小部分。

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

答案 2 :(得分:9)

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

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

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

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

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

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

答案 3 :(得分:6)

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

Self contained packaging

它的内容如下:

  

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

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

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

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

  •   

但这种方法的缺点是:

  

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

答案 4 :(得分:5)

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

答案 5 :(得分:3)

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

答案 6 :(得分:2)

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

答案 7 :(得分: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

答案 8 :(得分:0)

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

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

答案 9 :(得分:-1)

你可以看看oracle提供的jrecreate,它可能只是做你需要/想要的。

  

https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/jrecreate.htm