jar - Java ARchive ツール

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

形式

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

解説

jar ツールは、複数のファイルを 1 つの JAR アーカイブファイルに結合します。jar は、ZIP および ZLIB 圧縮形式をベースにした、汎用のアーカイブおよび圧縮ツールです。 jar は、主に Java のアプレットやアプリケーションを 1 つのアーカイブにパッケージ化するのを容易にするために考案されました。 アプレットやアプリケーションのコンポーネント (.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 を指定しない場合は、すべてのファイルが展開されます。指定した場合は、指定のファイル (1 つまたは複数) だけが展開されます。
f
2 番目の引数として、処理対象の JAR ファイルを指定します。 c とともに指定すると、2 番目の引数は、標準出力ではなく、作成される 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.jar 内に INDEX.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 ディレクトリ内のすべてのファイル (ただし、classes ディレクトリ自体は除く) を foo.jar に追加します。次に、bin ディレクトリに移動し、xyz.classfoo.jar に追加します。
-Joption
オプションを Java 仮想マシンに渡します。Java 仮想マシンでは、オプションは Java アプリケーション起動ツールの参照ページに記載されたオプションの 1 つです。 たとえば、-J-Xms48m と指定すると、スタートアップメモリは 48M バイトに設定されます。 -J を使って背後の仮想マシンにオプション渡すことはよく行われています。
指定した「ファイル」の中にディレクトリが含まれる場合は、そのディレクトリが再帰的に処理されます。

特定のディレクトリにあるすべてのファイルをアーカイブに追加する (アーカイブが既に存在する場合は、その内容を上書きする) には、次のようにします。
$ 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 サイトにあります)

Copyright © 2002 Sun Microsystems, Inc. All Rights Reserved.

Sun
Java ソフトウェア