简体   繁体   中英

How to deliver my Java application with a particular JRE?

Does somebody know how to pack a particular JRE together with a compiled Java application? I currently have an executable jar file and wish to put JRE 6 Update 31 in it. So that the application uses the shipped JRE regardless of which JRE version the client has installed. The solution should work platform independent.

Any ideas? Many thanks in advance!

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.

There are some caveats, however. This does make your distro larger and platform dependent, in my example Windows x64. However, it's doable and manageable. There are a finite number of platforms supported for the jre and guess what... they're platform dependent too.

On OSX, they are moving away from Apple providing Java to Oracle providing Java, this also means that Java will not be installed on a fresh install of OSX. Oracle have provided a tool for packing up Java installations and they strongly recommend providing a jre as part of your installation. The advantage of this is that the customer will not have to install an additional package in order to run your application, and you can test your application against the correct Java runtime for you and ensure there are no incomptabilities before shipping. The disavantage is that building the installer is slighty more complex and your download size is larger.

Of course building installers get more complex if you want to provide your applications for Windows, Linux ectera and it would be alot simpler to just provide an executable jar but this is not the experience customers want. Customers do not expect to be able to download one application and run the same exe on windows, osx and linux. They are happy
to have different installers for each platform and also expect the installers to work in a different way.

This is how I do it:

OSX:Use AppBundler with bundled jre, put onto a Dmg with DMGCanvas. The user simply drags the application to their /Application folder.

Windows:Use Izpack with bundled jre wrapped with launch4j so installer can be run as an exe.

Linux:Use Izpack without bundled jre, as user linux users like to be in control of exactly what on their machine, but specify minimum version of Java allowed. Ideally I should create packages for the main Linux Package Managers such as rpm but Ive decided this is not worth the effort at the moment as Linux users are a small percentage of my client base.

Most of the installation is automated using Maven and Ant, so its not a big effort to build these different installers.

We have the same situation with a commercial product in production. We've downloaded both windows and linux JREs of a specific version, and packed it with the application using IzPack .

"Our" JRE must be installed if one wants to install the app, and the app is being run by that JRE regardless of the system installed JREs or JDKs.

The downside is: installer is to be made for Windows or Linux and it is ~ 50 MB in size. The sizes of modules when unpacked are:

  • app itself ~ 5MB
  • libs ~10 MB
  • JRE ~90 MB

If I'd want to make it more "platform independent" I'd have to pack both JREs which would be ~100 MB for the installer. And it would still be valid for only two types of platforms (see Cthulhu' answer).

Note that we make the mostly remote installation's via SSH and that using compression options increases the package time by a factor of ~10 at least (from minutes to dozens of minutes).

A rather new solution, provided by Oracle, is here:

Self contained packaging

It reads:

Self-contained application packages provide the following benefits:

  • Users install the application with an installer that is familiar to them and launch it in the usual way.

  • You control the version of the JRE used by the application.

  • Applications can be deployed on fresh systems with no requirement for the JRE to be installed.

But a drawback of this approach is:

Self-contained application packages can only be built using JDK 7 Update 6 or later.

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

You can deploy it with java webstart which enables you to download a certain version of the jre if not present. I don't know if downgrading is possible, however. Java must be installed already, too.

You need platform-specific launchers that use a JRE that is placed next to the JAR file. Of course you can do this with batch files and shell scripts, but there are more professional solutions that create native launchers, such as install4j . (Disclaimer: my company develops install4j). A free solution is izpack .

This is not directly possible. To make it possible, you have to download VM's for every platform. For windows, copy the JRE to a directory and the jar and call distributed JVM by shell scripts. But this is so hard and the solution described by Cthulhu is best ie, check the version and point to the webpage.

However there are some you might check out.

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

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

If it is a NetBeans platform application, NetBeans itself has the option to bundle additional resources and JRE .

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

You can have a look at jrecreate provided by oracle and that may just do what you need / want .

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM