Java in a Windows EXE with launch4j

Originally published on: Sun, 16 Aug 2009 13:46:59 +0000

I noted today that a successful independently written / marketed ( MicroISV ) product had been built in Java. The redistributable files were available for both Windows and MacIntosh computers.

I emailed the author, asking what he used to build the installations for each. I’ll discuss the Mac software in a later post. For the Windows installation, he pointed me to a product called launch4j. ( See http://launch4j.sourceforge.net/ ).

Launch4j is an all-Java program that will bind a configurable Windows stub executable file to a Java jar file. The result is a jar embedded in a specially configured EXE.

When invoked, the EXE will execute the system’s appropriate JVM ( or will issue an error message if a compatible JVM hasn’t been found ) and will then execute the embedded jar file in this JVM.

Effectively, launch4j bottles up Java code into a Windows EXE.

Since launch4j is an all-Java program, one can actually build Windows EXE’s on various supported non-Windows platforms.

Let’s take a trivial sample Java program and turn it into an EXE with launch4j.

HeyGuys.java


// Display a simple message
// This code is in the public domain.

import javax.swing.*;

public class HeyGuys {
   public static void main(String[] args) {
      JOptionPane.showMessageDialog(null,"Hey, you guys!");
      System.exit(0);
   }
}

Enter the following to compile and execute the program:

javac HeyGuys.java 
java HeyGuys

The message:

heyguys

…should appear on the screen. Click OK.

Let’s take the file HeyGuys.class and put it in its own jar file. We first need to create a manifest file so that the jar will contain metadata to indicate which class should be executed via java.exe or javaw.exe.

Enter the following two lines in a file called manifest.mf:

Manifest-Version: 1.0
Main-Class: HeyGuys

Then, issue the following command:

jar -cfm heyguys.jar manifest.mf HeyGuys.class

Executing the above command should yield the file heyguys.jar.

Now, let’s try to execute the jar to see if we’ve packaged it up correctly.

java -jar heyguys.jar

You should see the same message window that was displayed earlier:

heyguys

Finally, let’s use launch4j to package up the jar into an EXE.

Although launch4j has a command-line interface, I first used the GUI. The first screen I filled in looked similar to this:

launch4j1

I tried to just save the EXE at that point, but I then needed to specify a minimum Java version on this tab:

launch4j2

After changing those values, launch4j wanted me to save those options in an XML file, so I just chose the name l4j.xml arbitrarily.

Launch4j then quickly packaged a small EXE.

If you run it on a version of Windows with Java 1.6.0 or above, you’ll see the message window. If you don’t have a 1.6.x JVM, you’ll be prompted to download one.

Note that launch4j is not an installer. Now that you have an EXE, you might want to build an installer around it with a product like Inno Setup or the NSIS installer system.

Also note that in addition to the bare options that I’ve chosen, a number of other options are available including the ability to set an icon and the ability to specify the JVM’s runtime parameters such has heap size.

The source code and EXE for the above sample program can be found here:

http://www.mailsend-online.com/wp/heyguys.zip

Advertisements

About Jim Lawless

I've been programming computers for about 36 years ... 30 of that professionally. I've been a teacher, I've worked as a consultant, and have written articles here and there for publications like Dr. Dobbs Journal, The C/C++ Users Journal, Nuts and Volts, and others.
This entry was posted in Programming and tagged , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s