Using JAR Files: The Basics


Using JAR Files: The Basics

JAR files are packaged with the ZIP file format, so you can use them for tasks such as lossless data compression, archiving, decompression, and archive unpacking. These tasks are among the most common uses of JAR files, and you can realize many JAR file benefits using only these basic features.

Even if you want to take advantage of advanced functionality provided by the JAR file format such as electronic signing, you`ll first need to become familiar with the fundamental operations.


To perform basic tasks with JAR files, you use the JavaTM Archive Tool provided as part of the Java Development Kit. Because the Java Archive tool is invoked by using the jar command, this tutorial refers to it as `the Jar tool`.


As a synopsis and preview of some of the topics to be covered in this section, the following table summarizes common JAR file operations:


























Common JAR file operations
Operation Command
To create a JAR file jar cf jar-file input-file(s)
To view the contents of a JAR file jar tf jar-file
To extract the contents of a JAR file jar xf jar-file
To extract specific files from a JAR file jar xf jar-file archived-file(s)
To run an application packaged as a JAR file (requires the Main-class manifest header)
java -jar app.jar
To invoke an applet packaged as a JAR file
<applet code=AppletClassName.class
archive=”JarFileName.jar
width=width height=height></applet>


This section shows you how to perform the most common JAR-file operations, with examples for each of the basic features:


Creating a JAR File


This section shows you how to use the Jar tool to package files and directories into a JAR file.

Viewing the Contents of a JAR File


You can display a JAR file`s table of contents to see what it contains without actually unpacking the JAR file.

Extracting the Contents of a JAR File


You can use the Jar tool to unpack a JAR file. When extracting files, the Jar tool makes copies of the desired files and writes them to the current directory, reproducing the directory structure that the files have in the archive.

Updating a JAR File


This section shows you how to update the contents of an existing JAR file by modifying its manifest or by adding files.

Running JAR-Packaged Software


This section shows you how to invoke and run applets and applications that are packaged in JAR files.

Running JAR-Packaged Software

Running JAR-Packaged Software

Now that you’ve learned how to create JAR files, how do you actually run the code that you’ve packaged? Consider these three scenarios:

  • Your JAR file contains an applet that is to be run inside a browser.

  • Your JAR file contains an application that is to be invoked from the command line.

  • Your JAR file contains code that you want to use as an extension.

This section will cover the first two situations. A separate trail in the tutorial on the extension mechanism covers the use of JAR files as extensions.


Applets Packaged in JAR Files


To invoke any applet from an HTML file for running inside a browser, you need to use the APPLET tag. For more information, see the Applets lesson. If the applet is bundled as a JAR file, the only thing you need to do differently is to use the ARCHIVE parameter to specify the relative path to the JAR file.

As an example, let’s use (again!) the TicTacToe demo applet that ships with the JavaTM Development Kit. The APPLET tag in the HTML file that calls the demo looks like this:


<applet code=TicTacToe.class
width=120 height=120>
</applet>
If the TicTacToe demo were packaged in a JAR file named TicTacToe.jar, you could modify the APPLET tag with the simple addition of an ARCHIVE parameter:
<applet code=TicTacToe.class
archive=”TicTacToe.jar”
width=120 height=120>
</applet>
The ARCHIVE parameter specifies the relative path to the JAR file that contains TicTacToe.class. This example assumes that the JAR file and the HTML file are in the same directory. If they’re not, you would need to include the JAR file’s relative path in the ARCHIVE parameter’s value. For example, if the JAR file was one directory below the HTML file in a directory called applets, the APPLET tag would look like this:
<applet code=TicTacToe.class
archive=”applets/TicTacToe.jar”
width=120 height=120>
</applet>

JAR Files as Applications


You can run JAR-packaged applications with the Java interpreter. The basic command is:
java -jar jar-file
The -jar flag tells the interpreter that the application is packaged in the JAR file format. You can only specify one JAR file, which must contain all the application-specific code.

Before you execute this command make sure the runtime environment has an information of which class within the JAR file is the application’s entry point.


To indicate which class is the application’s entry point, you must add a Main-Class header to the JAR file’s manifest. The header takes the form:


Main-Class: classname
The header’s value, classname, is the name of the class that’s the application’s entry point.

For more information, see the Setting an Application’s Entry Point section.


When the Main-Class is set in the manifest file, you can run the application from the command line:


java -jar app.jar

Updating a JAR File

Updating a JAR File

The Jar tool provides a u option which you can use to update the contents of an existing JAR file by modifying its manifest or by adding files.

The basic command for adding files has this format:


jar uf jar-file input-file(s)

In this command:



  • The u option indicates that you want to update an existing JAR file.

  • The f option indicates that the JAR file to update is specified on the command line.

  • jar-file is the existing JAR file that’s to be updated.

  • input-file(s) is a space-deliminated list of one or more files that you want to add to the Jar file.

Any files already in the archive having the same pathname as a file being added will be overwritten.


When creating a new JAR file, you can optionally use the -C option to indicate a change of directory. For more information, see the Creating a JAR File section.


Examples


Recall that TicTacToe.jar has these contents:
META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif

Suppose that you want to add the file images/new.gif to the JAR file. You could accomplish that by issuing this command from the parent directory of the images directory:


jar uf TicTacToe.jar images/new.gif

The revised JAR file would have this table of contents:


META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif
images/new.gif

You can use the -C option to “change directories” during execution of the command. For example:


jar uf TicTacToe.jar -C images new.gif
This command would change to the images directory before adding new.gif to the JAR file. The images directory would not be included in the pathname of new.gif when it’s added to the archive, resulting in a table of contents that looks like this:
META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif
new.gif

Extracting the Contents of a JAR File

Extracting the Contents of a JAR File

The basic command to use for extracting the contents of a JAR file is:
jar xf jar-file [archived-file(s)]

Let’s look at the options and arguments in this command:



  • The x option indicates that you want to extract files from the JAR archive.

  • The f options indicates that the JAR file from which files are to be extracted is specified on the command line, rather than through stdin.

  • The jar-file argument is the filename (or path and filename) of the JAR file from which to extract files.

  • archived-file(s) is an optional argument consisting of a space-separated list of the files to be extracted from the archive. If this argument is not present, the Jar tool will extract all the files in the archive.

As usual, the order in which the x and f options appear in the command doesn’t matter, but there must not be a space between them.


When extracting files, the Jar tool makes copies of the desired files and writes them to the current directory, reproducing the directory structure that the files have in the archive. The original JAR file remains unchanged.






Caution: When it extracts files, the Jar tool will overwrite any existing files having the same pathname as the extracted files.



An Example


Let’s extract some files from the TicTacToe JAR file we’ve been using in previous sections. Recall that the contents of TicTacToe.jar are:
META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif

Suppose you want to extract the TicTacToe class file and the cross.gif image file. To do so, you can use this command:


jar xf TicTacToe.jar TicTacToe.class images/cross.gif

This command does two things:



  • It places a copy of TicTacToe.class in the current directory.

  • It creates the directory images, if it doesn’t already exist, and places a copy of cross.gif within it.

The original TicTacToe JAR file remains unchanged.


As many files as desired can be extracted from the JAR file in the same way. When the command doesn’t specify which files to extract, the Jar tool extracts all files in the archive. For example, you can extract all the files in the TicTacToe archive by using this command:


jar xf TicTacToe.jar

Viewing the Contents of a JAR File


Viewing the Contents of a JAR File

The basic format of the command for viewing the contents of a JAR file is:
jar tf jar-file
Let’s look at the options and argument used in this command:

  • The t option indicates that you want to view the table of contents of the JAR file.

  • The f option indicates that the JAR file whose contents are to be viewed is specified on the command line.

  • The jar-file argument is the path and name of the JAR file whose contents you want to view.

The t and f options can appear in either order, but there must not be any space between them.


This command will display the JAR file’s table of contents to stdout.


You can optionally add the verbose option, v, to produce additional information about file sizes and last-modified dates in the output.


An Example


Let’s use the Jar tool to list the contents of the TicTacToe.jar file we created in the previous section:
jar tf TicTacToe.jar

This command displays the contents of the JAR file to stdout:


META-INF/MANIFEST.MF
TicTacToe.class
audio/
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au
images/
images/cross.gif
images/not.gif

The JAR file contains the TicTacToe class file and the audio and images directory, as expected. The output also shows that JAR file contains a default manifest file, META-INF/MANIFEST.MF, which was automatically placed in the archive by the JAR tool. For more information, see the Understanding the Default Manifest section.


All pathnames are displayed with forward slashes, regardless of the platform or operating system you’re using. Paths in JAR files are always relative; you’ll never see a path beginning with C:, for example.


The JAR tool will display additional information if you use the v option:


jar tvf TicTacToe.jar

For example, the verbose output for the TicTacToe JAR file would look similar to this:


 256 Mon Apr 18 10:50:28 PDT 2005 META-INF/MANIFEST.MF
3885 Mon Apr 18 10:49:50 PDT 2005 TicTacToe.class
0 Wed Apr 20 16:39:32 PDT 2005 audio/
4032 Wed Apr 20 16:39:32 PDT 2005 audio/beep.au
2566 Wed Apr 20 16:39:32 PDT 2005 audio/ding.au
6558 Wed Apr 20 16:39:32 PDT 2005 audio/return.au
7834 Wed Apr 20 16:39:32 PDT 2005 audio/yahoo1.au
7463 Wed Apr 20 16:39:32 PDT 2005 audio/yahoo2.au
0 Wed Apr 20 16:39:44 PDT 2005 images/
157 Wed Apr 20 16:39:44 PDT 2005 images/cross.gif
158 Wed Apr 20 16:39:44 PDT 2005 images/not.gif

Creating a JAR File

The basic format of the command for creating a JAR file is:

jar cf jar-file input-file(s)
The options and arguments used in this command are:

  • The c option indicates that you want to create a JAR file.

  • The f option indicates that you want the output to go to a file rather than to stdout.

  • jar-file is the name that you want the resulting JAR file to have. You can use any filename for a JAR file. By convention, JAR filenames are given a .jar extension, though this is not required.

  • The input-file(s) argument is a space-separated list of one or more files that you want to include in your JAR file. The input-file(s) argument can contain the wildcard * symbol. If any of the “input-files” are directories, the contents of those directories are added to the JAR archive recursively.

The c and f options can appear in either order, but there must not be any space between them.


This command will generate a compressed JAR file and place it in the current directory. The command will also generate a default manifest file for the JAR archive.






Note: The metadata in the JAR file, such as the entry names, comments, and contents of the manifest, must be encoded in UTF8.



You can add any of these additional options to the cf options of the basic command:






















jar command options
Option Description
v Produces verbose output on stdout while the JAR file is being built. The verbose output tells you the name of each file as it’s added to the JAR file.
0 (zero) Indicates that you don’t want the JAR file to be compressed.
M Indicates that the default manifest file should not be produced.
m Used to include manifest information from an existing manifest file. The format for using this option is:
jar cmf existing-manifest jar-file input-file(s)
See Modifying a Manifest File for more information about his option.



Warning: The manifest must end with a new line or carriage return. The last line will not be parsed properly if it does not end with a new line or carriage return.


-C To change directories during execution of the command. See below for an example.






Note:  When you create a JAR file, the time of creation is stored in the JAR file. Therefore, even if the contents of the JAR file do not change, when you create a JAR file multiple times, the resulting files are not exactly identical. You should be aware of this when you are using JAR files in a build environment. It is recommended that you use versioning information in the manifest file, rather than creation time, to control versions of a JAR file. See the Setting Package Version Information section.



An Example


Let us look at an example. A simple TicTacToe applet. You can see the source code of this Applet at TicTacToe.java. This demo contains a bytecode class file, audio files, and images having this structure:

TicTacToe folder Hierarchy



TicTacToe folder Hierarchy


The audio and images subdirectories contain sound files and GIF images used by the applet.



You can obtain all these files from jar/examples directory when you download the entire Tutorial online. To package this demo into a single JAR file named TicTacToe.jar, you would run this command from inside the TicTacToe directory:


jar cvf TicTacToe.jar TicTacToe.class audio images
The audio and images arguments represent directories, so the Jar tool will recursively place them and their contents in the JAR file. The generated JAR file TicTacToe.jar will be placed in the current directory. Because the command used the v option for verbose output, you would see something similar to this output when you run the command:
adding: TicTacToe.class (in=3825) (out=2222) (deflated 41%)
adding: audio/ (in=0) (out=0) (stored 0%)
adding: audio/beep.au (in=4032) (out=3572) (deflated 11%)
adding: audio/ding.au (in=2566) (out=2055) (deflated 19%)
adding: audio/return.au (in=6558) (out=4401) (deflated 32%)
adding: audio/yahoo1.au (in=7834) (out=6985) (deflated 10%)
adding: audio/yahoo2.au (in=7463) (out=4607) (deflated 38%)
adding: images/ (in=0) (out=0) (stored 0%)
adding: images/cross.gif (in=157) (out=160) (deflated -1%)
adding: images/not.gif (in=158) (out=161) (deflated -1%)

You can see from this output that the JAR file TicTacToe.jar is compressed. The Jar tool compresses files by default. You can turn off the compression feature by using the 0 (zero) option, so that the command would look like:


jar cvf0 TicTacToe.jar TicTacToe.class audio images

You might want to avoid compression, for example, to increase the speed with which a JAR file could be loaded by a browser. Uncompressed JAR files can generally be loaded more quickly than compressed files because the need to decompress the files during loading is eliminated. However, there is a tradeoff in that download time over a network may be longer for larger, uncompressed files.


The Jar tool will accept arguments that use the wildcard * symbol. As long as there weren’t any unwanted files in the TicTacToe directory, you could have used this alternative command to construct the JAR file:


jar cvf TicTacToe.jar *

Though the verbose output doesn’t indicate it, the Jar tool automatically adds a manifest file to the JAR archive with path name META-INF/MANIFEST.MF. See the Working with Manifest Files: The Basics section for information about manifest files.


In the above example, the files in the archive retained their relative path names and directory structure. The Jar tool provides the -C option that you can use to create a JAR file in which the relative paths of the archived files are not preserved. It’s modeled after TAR’s -C option.


As an example, suppose you wanted to put audio files and gif images used by the TicTacToe demo into a JAR file, and that you wanted all the files to be on the top level, with no directory hierarchy. You could accomplish that by issuing this command from the parent directory of the images and audio directories:


jar cf ImageAudio.jar -C images . -C audio .
The -C images part of this command directs the Jar tool to go to the images directory, and the . following -C images directs the Jar tool to archive all the contents of that directory. The -C audio . part of the command then does the same with the audio directory. The resulting JAR file would have this table of contents:
META-INF/MANIFEST.MF
cross.gif
not.gif
beep.au
ding.au
return.au
yahoo1.au
yahoo2.au
By contrast, suppose that you used a command that did not employ the -C option:
jar cf ImageAudio.jar images audio
The resulting JAR file would have this table of contents:
META-INF/MANIFEST.MF
images/cross.gif
images/not.gif
audio/beep.au
audio/ding.au
audio/return.au
audio/yahoo1.au
audio/yahoo2.au

Working with Manifest Files: The Basics

Working with Manifest Files: The Basics

JAR files support a wide range of functionality, including electronic signing, version control, package sealing, and others. What gives a JAR file this versatility? The answer is the JAR file’s manifest.

The manifest is a special file that can contain information about the files packaged in a JAR file. By tailoring this “meta” information that the manifest contains, you enable the JAR file to serve a variety of purposes.


This lesson will explain the contents of the manifest file and show you how to work with it, with examples for the basic features:


Understanding the Default Manifest


When you create a JAR file, a default manifest is created automatically. This section describes the default manifest.

Modifying a Manifest File


This section shows you the basic method of modifying a manifest file. The later sections demonstrate specific modifications you may want to make.


Setting an Application’s Entry Point


This section describes how to use the Main-Class header in the manifest file to set an application’s entry point.

Adding Classes to the JAR File’s Classpath


This section describes how to use the Class-Path header in the manifest file to add classes in other JAR files to the classpath when running an applet or application.

Setting Package Version Information


This section describes how to use the package version headers in the manifest file.

Sealing Packages within a JAR File


This section describes how to seal packages within a JAR file by modifying the manifest file.

Adding Classes to the JAR File’s Classpath

Adding Classes to the JAR File’s Classpath

You may need to reference classes in other JAR files from within a JAR file.

For example, in a typical situation an applet is bundled in a JAR file whose manifest references a different JAR file (or several different JAR files) that serves as utilities for the purposes of that applet.


You specify classes to include in the Class-Path header field in the manifest file of an applet or application. The Class-Path header takes the following form:


Class-Path: jar1-name jar2-name directory-name/jar3-name
By using the Class-Path header in the manifest, you can avoid having to specify a long -classpath flag when invoking Java to run the your application.






Note : The Class-Path header points to classes or JAR files on the local network, not JAR files within the JAR file or classes accessible over internet protocols. To load classes in JAR files within a JAR file into the class path, you must write custom code to load those classes. For example, if MyJar.jar contains another JAR file called MyUtils.jar, you cannot use the Class-Path header in MyJar.jar’s manifest to load classes in MyUtils.jar into the class path.




An Example


We want to load classes in MyUtils.jar into the class path for use in MyJar.jar. These two JAR files are in the same directory.

We first create a text file named Manifest.txt with the following contents:


Class-Path: MyUtils.jar





Warning : The text file must end with a new line or carriage return. The last line will not be parsed properly if it does not end with a new line or carriage return.



We then create a JAR file named MyJar.jar by entering the following command:


jar cfm MyJar.jar Manifest.txt MyPackage/*.class
This creates the JAR file with a manifest with the following contents:
Manifest-Version: 1.0
Class-Path: MyUtils.jar
Created-By: 1.6.0 (Sun Microsystems Inc.)
The classes in MyUtils.jar are now loaded into the class path when you run MyJar.jar.

Setting an Application’s Entry Point

Setting an Application’s Entry Point

If you have an application bundled in a JAR file, you need some way to indicate which class within the JAR file is your application’s entry point. You provide this information with the Main-Class header in the manifest, which has the general form:
Main-Class: classname
The value classname is the name of the class that is your application’s entry point.

Recall that the entry point is a class having a method with signature public static void main(String[] args).


After you have set the Main-Class header in the manifest, you then run the JAR file using the following form of the java command:


java -jar JAR-name
The main method of the class specified in the Main-Class header is executed.


An Example


We want to execute the main method in the class MyClass in the package MyPackage when we run the JAR file.

We first create a text file named Manifest.txt with the following contents:


Main-Class: MyPackage.MyClass





Warning: The text file must end with a new line or carriage return. The last line will not be parsed properly if it does not end with a new line or carriage return.


We then create a JAR file named MyJar.jar by entering the following command:
jar cfm MyJar.jar Manifest.txt MyPackage/*.class
This creates the JAR file with a manifest with the following contents:
Manifest-Version: 1.0
Created-By: 1.6.0 (Sun Microsystems Inc.)
Main-Class: MyPackage.MyClass
When you run the JAR file with the following command, the main method of MyClass executes:
java -jar MyJar.jar

Setting an Entry Point with the JAR Tool


The ‘e’ flag (for ‘entrypoint’), introduced in JDK 6, creates or overrides the manifest’s Main-Class attribute. It can be used while creating or updating a jar file. Use it to specify the application entry point without editing or creating the manifest file.
For example, this command creates app.jar where the Main-Class attribute value in the manifest is set to MyApp:
jar cfe app.jar MyApp MyApp.class

You can directly invoke this application by running the following command:


java -jar app.jar

If the entrypoint class name is in a package it may use a ‘.’ (dot) character as the delimiter. For example, if Main.class is in a package called foo the entry point can be specified in the following ways:


jar cfe Main.jar foo.Main foo/Main.class

Modifying a Manifest File

Modifying a Manifest File

You use the m command-line option to add custom information to the manifest during creation of a JAR file. This section describes the m option.

The Jar tool automatically puts a default manifest with the pathname META-INF/MANIFEST.MF into any JAR file you create. You can enable special JAR file functionality, such as package sealing, by modifying the default manifest. Typically, modifying the default manifest involves adding special-purpose headers to the manifest that allow the JAR file to perform a particular desired function.


To modify the manifest, you must first prepare a text file containing the information you wish to add to the manifest. You then use the Jar tool’s m option to add the information in your file to the manifest.





Warning :  The text file from which you are creating the manifest must end with a new line or carriage return. The last line will not be parsed properly if it does not end with a new line or carriage return.




The basic command has this format:


jar cfm jar-file manifest-addition input-file(s)

Let’s look at the options and arguments used in this command:

The m and f options must be in the same order as the corresponding arguments.






Note : The contents of the manifest must be encoded in UTF8.




The remaining sections of this lesson demonstrate specific modifications you may want to make to the manifest file.