如何使用特定的JRE来交付我的Java应用程序?
有人知道如何打包一个特定的JRE与一个编译的Java应用程序? 我目前有一个可执行的jar文件,并希望把JRE 6更新31中。 这样,无论客户端安装了哪个JRE版本,应用程序都使用发货的JRE。 解决scheme应该独立工作平台。
有任何想法吗? 提前谢谢了!
在OSX上,他们正在从提供Java的Apple转移到提供Java的Oracle,这也意味着Java将不会安装在全新的OSX上。 Oracle提供了一个打包Java安装的工具,他们强烈build议您提供一个jre作为安装的一部分。 这样做的好处是,客户不必为了运行应用程序而安装额外的软件包,并且可以针对正确的Java运行时testing您的应用程序,并确保在发货前没有不可兼容性。 缺点是构build安装程序稍微复杂一点,你的下载大小更大。
当然,如果你想为Windows,Linux环境提供你的应用程序,构build安装程序会变得更加复杂,并且提供一个可执行的jar会比较简单,但这不是客户所需的体验。 客户不希望能够下载一个应用程序,并在Windows,OSX和Linux上运行相同的EXE。 他们很开心
为每个平台安装不同的安装程序,并期望安装人员以不同的方式工作。
这是我如何做到的:
OSX:将AppBundler与捆绑的jre一起使用,使用DMGCanvasjoinDmg。 用户只需拖动应用程序到他们的/应用程序文件夹。
Windows:使用与launch4j捆绑包装的jpack,所以安装程序可以作为exe运行。
Linux:使用Izpack而不捆绑jre,因为用户linux用户喜欢控制他们机器上的内容,但是指定允许的最低版本的Java。 理想情况下,我应该为主要的Linux软件包pipe理器(例如rpm)创build软件包,但是由于Linux用户只占我的客户群的一小部分,我认为目前不值得付出努力。
大部分的安装是使用Maven和Ant自动完成的,所以build立这些不同的安装程序并不是一个很大的努力。
如果你已经在目标平台上安装了jre,那么你可以说Windows 64位,只需将你的Java安装目录下的jre
文件夹下的所有东西拷贝到你的发行版中即可。 然后创build一个batch file来指向你的本地jre而不是系统。
这是我做的:
- 我的jar文件在
dist
文件夹中 - 将系统
jre
文件夹复制到dist\jre-win-1.7.0_04
- 用下面这行创build一个.bat文件
jre-win-1.7.0_04\bin\java.exe -jar MyProgram.jar
..布,做完了! 双击该batch file,并使用本地jre运行你的jar文件。 为了certificate这一点,卸载你的系统jre并双击batch file。 仍然有效。
您可以在Linux或OS X上以类似的方式执行此操作。
我也想指出,这是一个相当普遍的做法,许多Java发行版都是这样做的。 所以,不要说你不能或不应该。
但是有一些警告。 这确实使您的发行版更大,并取决于平台,在我的示例Windows x64中。 但是,这是可行和可pipe理的。 jre支持的平台数量有限,并且猜测它们是平台依赖的。
我们和生产中的商业产品有相同的情况。 我们已经下载了特定版本的Windows和Linux JRE,并使用IzPack将其与应用程序打包在一起。
如果需要安装应用程序,则必须安装“我们的”JRE,而不pipe系统安装了JRE或JDK,该应用程序都由该JRE运行。
缺点是:安装程序是为Windows或Linux制作的,大小约为50 MB。 拆包时模块的大小是:
- 应用程序本身~5MB
- libs〜10 MB
- JRE〜90 MB
如果我想使它更“独立于平台”,我将不得不打包两个JRE,这将是大约100 MB的安装程序。 只有两种平台才有效(见克苏鲁的答案)。
请注意,我们通过SSH进行大部分远程安装,使用压缩选项至less可以将包时间增加10倍(从几分钟到几十分钟)。
看看你是否打算分发这个包(你的应用程序+ JRE),那么有一个实用程序install4J ,它是一个function强大的多平台Java安装程序生成器,它为Java应用程序生成本地安装程序和应用程序启动器。
您可以使用java webstart进行部署,使您可以下载某个版本的jre(如果不存在)。 但是,我不知道降级是否可行。 Java也必须已经安装。
您需要使用JRE文件旁边的JRE的特定于平台的启动器。 当然,你可以用batch file和shell脚本来做到这一点,但是还有更多专业的解决scheme来创build本地启动器,比如install4j 。 (免责声明:我公司开发install4j)。 免费的解决scheme是izpack 。
Oracle提供了一个相当新的解决scheme:
自包含的包装
它写道:
自包含的应用程序包提供以下好处:
用户使用熟悉的安装程序安装应用程序,并以通常的方式启动。
您可以控制应用程序使用的JRE的版本。
应用程序可以部署在新的系统上,而不需要安装JRE。
但是这种方法的缺点是:
自包含的应用程序包只能使用JDK 7 Update 6或更高版本构build。
这不是直接可能的。 为了使它成为可能,你必须为每个平台下载虚拟机。 对于windows,将JRE复制到一个目录中,然后通过shell脚本调用分布式JVM。 但是这很难,克苏鲁描述的解决scheme是最好的,即检查版本并指向网页。
不过也有一些你可能会检查出来。
JSmooth – http://jsmooth.sourceforge.net/
Jar2Exe – http://transfer2pc.weebly.com/1/post/2011/10/jar2exe-converter-11-gui.html
你可以看看oracle提供的jrecreate,它可能只是做你需要/想要的。
https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/jrecreate.htm