Distributing your Application as an Executable JAR file
Distributing your Application as an executable JAR file
A JAR (Java ARchive) is a way of packaging together all of the resources associated with a program (class files, images, sounds, etc.). Putting your program in a JAR allows it to be distributed as a single executable file, saving space and simplifying the download process. The information in this tutorial applies to Java version 1.2 or higher. For more information about JAR files, follow Sun's tutorial. To learn about signing the JAR and Java Web Start.
A simple example. Let's say we wanted to distribute the simple program Hello.java as a JAR. First, we create a text file named Hello.mf which contains:
Then, we create the archive by typing:Manifest-Version: 1.0 Main-Class: Helloand run it by typing:jar cmf Hello.mf Hello.jar Hello.class Hello.javaThe file Hello.jar can now be downloaded and executed.java -jar Hello.jar
Creating an executable JAR file. Here is the general procedure for creating an executable JAR:
Compile your java code, generating all of the program's class files.
Create a manifest file containing the following 2 lines:
The name of the file should end with the .mf suffix. It is important that the file ends with a blank line.Manifest-Version: 1.0 Main-Class: name of class containing mainTo create the JAR, type the following command:
The input-files must include any class files, images, sounds, etc. that your program uses. Optionally, you can include the program'sjar cmf manifest-file jar-file input-files.java
files in the JAR. See below for adding directories ot the JAR.To view the contents of the JAR, type:
jar tf jar-fileExecute the application from the command line by typing:
If the application is GUI-based, you can also launch it by double-clicking the JAR file.java -jar jar-fileAccessing resources in a JAR. In general, the first step in accessing a JAR resource involves creating a URL. This might require modifying your program. For example, you can no longer use the following code fragment to read in an image that is stored in a file as follows
Instead, create the URL object usingImage image = Toolkit.getDefaultToolkit().getImage(filename);Or, if the code is in a static method of class X, then create the URL withURL url = getClass.getResource(filename); Image image = Toolkit.getDefaultToolkit().getImage(url);Now, the resource can be accessed the same way, regardless of whether it is in a JAR or the current directory. See the methodURL url = X.class.getResource(filename);play(filename)
in StdDraw.java for an example involving audio clips, and and the constructorIn(String s)
in In.java for an example involving text files.JAR Subdirectories. The JAR format also support storing files in a directory structure. Consider a program
Sample.java
, which uses the Turtle Graphics interface to display a collection of pictures stored in a subdirectory calledimages
. Our working directory looks like:
The Manifest should read:
Manifest-Version: 1.0 Main-Class: SampleTo create the JAR, type:
jar cmf Sample.mf Sample.jar Sample.class Turtle.class Sample.java Turtle.java imagesThe contents listing appears as:
META-INF/ META-INF/MANIFEST.MF Sample.class Turtle.class Sample.java Turtle.java images/ images/image1.gif images/image2.gif images/image3.gifNotice that the directory structure is still preserved (the META-INF directory is created to hold the manifest and other general information about the JAR).