How do I bundle a JRE into an EXE for a Java Application? Launch4j says "runtime is missing or corrupted."

MagicGuy52 picture MagicGuy52 · Dec 21, 2012 · Viewed 64.5k times · Source

I am new to programming in Java but am generally familiar with how everything works. I would like to be able to put both a jar file and a jre into a windows executable(exe) so that when I distribute it, the client needn't have a JRE installed. What program should I use?

I have launch4j and it seems to do exactly what I want but when I try to run the app, I get "This application was configured to use a bundled Java Runtime Environment but the runtime is missing or corrupted."

I want my app to just be a runnable exe, not an installer. At the very least, can anyone show me how to correctly bundle a JRE with launch4j?

Answer

ban-geoengineering picture ban-geoengineering · Mar 25, 2013

The only way I could bundle a JRE was to use Launch4J and Inno Setup Compiler.

First, create a jre6 folder (for example) in the same directory as your output file (.exe).

Then copy the JRE from your system into your jre6 folder.

Then you open Launch4J and set the Bundled JRE path - just type in jre6. Then click the Build button (obviously, after you've entered all the other parameters - but the only value you need to enter on the JRE tab itself is the Bundled JRE path value.)

I would have expected that to work, but if you then move the .exe to a new location (so it is no longer co-located with your jre6 folder) you get the This application was configured to use a bundled Java Runtime Environment but the runtime is missing or corrupted error when you try to run the application...

I've been playing around with this all day and there was no way I could get Launch4J to include the JRE in the .exe file. Really poor in my opinion, as their documentation does not seem to allude to this issue at all.

So what I did to solve was to use Inno Setup Compiler (ISC). This app is used to wrap your .exe as a Windows Installer file. So I added a setting to the ISC script that copies the JRE into the installer package. The line I added to the script (in the [Files] section) was:

Source: "M:\Netbeans\MyApp\jre6\*"; DestDir: "{app}\jre6\"; Flags: recursesubdirs createallsubdirs

...a bit of workaround, but it did the trick.

Repeat all the above steps, and you should be sorted.