jar - Java ARchive ツール

複数のファイルを 1 つの Java ARchive (JAR) ファイルに統合します。

形式

jar [ options ] [manifest] destination input-file [input-files]

解説

jar ツールは、複数のファイルを 1 つの JAR アーカイブファイルに統合します。 jar は、ZIP および ZLIB 圧縮形式の、汎用のアーカイブおよび圧縮ツールです。jar は、主として Java アプレットやアプリケーションを 1 つのアーカイブにパッケージ化するのを容易にするために考案されました。Java アプレットやアプリケーション (.class ファイル、イメージおよびサウンド) のコンポーネントが 1 つのアーカイブに結合されているとき、Java エージェント (ブラウザなど) による 1 回の HTTP 処理だけでダウンロードできるので、各ファイルごとに新しく接続する必要はありません。ダウンロード回数の面で大幅に向上しています。また jar はファイルの圧縮によって、さらにダウンロード時間を短くします。作成元の認証を可能にするため、アプレット作成者による署名を、ファイルの個々のエントリに書き込むことができます。jar ツールの構文は、tar コマンドの構文とほぼ同じです。jar アーカイブは、圧縮状態にかかわらず、クラスパスのエントリとして使用できます。

jar ツールの入力ファイルには、次の 3 種類があります。

標準的な使用方法は、
        % jar cf myjarfile *.class
です。この例では、現在のディレクトリのクラスファイルはすべて、myjarfile という名前のファイルに統合されます。マニフェストファイルは、jar ツールによって自動的に生成され、jar ファイルの中で常に先頭に置かれます。デフォルトでは、META-INF/MANIFEST.MF と名付けられます。マニフェストファイルには、アーカイブのメタ情報が格納されています。マニフェストファイルにメタ情報がどのようにして格納されるかについての詳細は、JAR ファイルの仕様を参照してください。

新しい jar アーカイブを作成するために jar ツールで使用したいマニフェストファイルがすでにある場合は、‐m オプションを使用してファイルを指定できます。

        % jar cmf myManifestFile myJarFile *.class
使用する既存のマニフェストファイルすべてが、改行コードで終わることを確認してください。マニフェストファイルの最後の行が改行文字で終わっていない場合、その行の構文解析は行われません。「cmf」ではなく「cfm」を指定したとき (「m」オプションと「f」オプションを逆に指定したとき) は、jar アーカイブの名前のあとにマニフェストファイルの名前を指定する必要があります。
        % jar cfm myJarFile myManifestFile *.class
マニフェストファイルは RFC822 ascii 形式を使用しているため、内容の表示や処理は容易に行えます。

Java 2 SDK のバージョン 1.3 以降から、jar ユーティリティで JarIndex がサポートされています。 JarIndex を使用すれば、アプリケーションのクラスローダで jar ファイルからクラスをロードされるときの効率が向上します。アプリケーションまたはアプレットが複数の jar ファイルにバンドルされている場合は、クラスがロードされるときに、必要な jar ファイル以外のダウンロードおよびオープンは行われません。このパフォーマンスの最適化は、新しい -i オプションを指定して jar を実行すると有効になります。このオプションによって、指定した jar メインファイルおよび関連付けられているすべての jar ファイルに対して、パッケージ位置情報が生成されます。 これらの jar ファイルは、jar メインファイルのマニフェストの Class-Path 属性に指定しておく必要があります。

% jar -i main.jar

この例では、INDEX.LIST ファイルが、main.jar のマニフェストの META-INF ディレクトリに挿入されます。
アプリケーションのクラスローダは、このファイルに格納されている情報を使用して、効率的にクラスをロードします。インデックスファイルに位置情報を格納する方法についての詳細は、JarIndex の仕様を参照してください。

jar ツールを使用して jar ファイルとそのマニフェストを操作する例は、「例」および Java チュートリアルの「Jar」を参照してください。

オプション

c
標準出力に新規または空のアーカイブを作成します。
t
標準出力から内容を表形式で一覧表示します。
x file
すべてのファイルまたは指定のファイルだけを、標準入力から展開します。file の指定を省略した場合、すべてのファイルが展開されます。 指定した場合は、指定のファイルだけを展開します。
f
2 番目の引数で、処理される jar ファイルを指定します。c は、(標準出力の代わりに) 作成される jar ファイルの名前を示します。t は一覧表示される jar ファイル、x は展開される jar ファイルを示します。
v
標準エラー出力に詳細を出力します。
m
指定した既存のマニフェストファイルからマニフェスト情報を取り込みます。たとえば、次のようにして使います。
jar cmf myManifestFile myJarFile *.class
デフォルトのマニフェストに指定されていないマニフェストファイルに、特殊目的の名前と値の属性ヘッダを追加できます。このヘッダには、ベンダー情報、バージョン情報、パッケージシーリングなどを指定できるほか、Jar がバンドルされたアプリケーションを実行可能にするヘッダを指定することもできます。m オプションの使用例は、Java チュートリアルの「JAR Files」および Web ページの「開発者向けノート」を参照してください。
0
ZIP による圧縮を使用せずに保存だけを行います。
M
エントリに使用するマニフェストファイルを作成しません。
u
ファイルを追加するかマニフェストを変更して、既存の JAR ファイルを更新します。次に例を示します。
jar uf foo.jar foo.class
ファイル foo.class を既存の JAR ファイル foo.jar に追加します。
jar umf manifest foo.jar
foo.jar のマニフェストを manifest 内の情報で更新します。
i
指定された jar ファイルおよび関連付けられている jar ファイルのインデックス情報を生成します。次に例を示します。
jar -i foo.jar

foo.jarINDEX.LIST ファイルが生成されます。 このファイルには、foo.jar および foo.jarClass-Path 属性に指定されているすべての jar ファイルの、各パッケージの位置情報が書き込まれています。

-C
次の引数を処理しながら、jar コマンドの実行中に、一時的にディレクトリを変更します。その処理は、UNIX の tar ユーティリティの -C オプションを真似たものです。次に例を示します。
jar uf foo.jar -C classes bar.class
上記コマンド行は、classes ディレクトリに変更して、そのディレクトリの bar.classfoo.jar に追加します。
jar uf foo.jar -C classes .-C bin xyz.class
上記コマンド行は、classes ディレクトリに変更して、classes ディレクトリ内のすべてのファイル (ただし、クラスディレクトリ自体は含まない) を foo.jar に追加します。さらに、bin ディレクトリに変更して、xyz.classfoo.jar に追加します。
「ファイル」の中にディレクトリが含まれる場合には、そのディレクトリは再帰的に処理されます。

特定のディレクトリのファイルをすべて、アーカイブに追加する場合:
$ ls
0.au            3.au            6.au            9.au            at_work.gif
1.au            4.au            7.au            Animator.class  monkey.jpg
2.au            5.au            8.au            Wave.class      spacemusic.au
$ jar cvf bundle.jar *
adding: 0.au
adding: 1.au
adding: 2.au
adding: 3.au
adding: 4.au
adding: 5.au
adding: 6.au
adding: 7.au
adding: 8.au
adding: 9.au
adding: Animator.class
adding: Wave.class
adding: at_work.gif
adding: monkey.jpg
adding: spacemusic.au
$
html ディレクトリの中に、イメージ、オーディオファイルおよびクラス用のサブディレクトリがすでにある場合、1 つの jar ファイルの中に各ディレクトリを格納することができます。
$ ls
audio classes images
$ jar cvf bundle.jar audio classes images
adding: audio/1.au
adding: audio/2.au
adding: audio/3.au
adding: audio/spacemusic.au
adding: classes/Animator.class
adding: classes/Wave.class
adding: images/monkey.jpg
adding: images/at_work.gif
$ ls -l
total 142
drwxr-xr-x   2 brown    green        512 Aug  1 22:33 audio
-rw-r--r--   1 brown    green      68677 Aug  1 22:36 bundle.jar
drwxr-xr-x   2 brown    green        512 Aug  1 22:26 classes
drwxr-xr-x   2 brown    green        512 Aug  1 22:25 images
$
jar ツールと t オプションにより、jar ファイルの中のエントリ名を見ることができます。
$ ls
audio bundle.jar classes images
$ jar tf bundle.jar
META-INF/MANIFEST.MF
audio/1.au
audio/2.au
audio/3.au
audio/spacemusic.au
classes/Animator.class
classes/Wave.class
images/monkey.jpg
images/at_work.gif
$
v オプションを使用して詳細に列挙すると、サイズや最新の更新日など、アーカイブ内のファイルについての詳細情報を得ることができます。
$ jar tvf bundle.jar
   145 Thu Aug 01 22:27:00 PDT 1996 META-INF/MANIFEST.MF
   946 Thu Aug 01 22:24:22 PDT 1996 audio/1.au
  1039 Thu Aug 01 22:24:22 PDT 1996 audio/2.au
   993 Thu Aug 01 22:24:22 PDT 1996 audio/3.au
 48072 Thu Aug 01 22:24:23 PDT 1996 audio/spacemusic.au
 16711 Thu Aug 01 22:25:50 PDT 1996 classes/Animator.class
  3368 Thu Aug 01 22:26:02 PDT 1996 classes/Wave.class
 12809 Thu Aug 01 22:24:48 PDT 1996 images/monkey.jpg
   527 Thu Aug 01 22:25:20 PDT 1996 images/at_work.gif
$

株取引アプリケーション (アプレット) を次の jar ファイルにバンドルした場合は、次の情報が出力されます。

main.jar buy.jar sell.jar other.jar
main.jar のマニフェストの Class-Path 属性に次のように指定した場合、
Class-Path:buy.jar sell.jar other.jar
-i オプションを使用すれば、アプリケーションのクラスのロードを高速化できます。
$ jar -i main.jar
INDEX.LIST ファイルが META-INF ディレクトリに追加されます。 この結果、アプリケーションのクラスローダによってクラスまたはリソースの検索が行われるときに、適切な jar ファイルがダウンロードされます。

関連項目

Jar ファイルの概要
JAR ファイルの仕様
JAR インデックス
Java チュートリアル (Java ソフトウェアの Web サイトにあります)