jar - Java Archive ツール

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

形式

JAR ファイルの作成
jar c[v0M]f jarfile [-C dir] inputfiles [-Joption]
jar c[v0]mf manifest jarfile [-C dir] inputfiles [-Joption]
jar c[v0M] [-C dir] inputfiles [-Joption]
jar c[v0]m manifest [-C dir] inputfiles [-Joption]

JAR ファイルの更新
jar u[v0M]f jarfile [-C dir] inputfiles [-Joption]
jar u[v0]mf manifest jarfile [-C dir] inputfiles [-Joption]
jar u[v0M] [-C dir] inputfiles [-Joption]
jar u[v0]m manifest [-C dir] inputfiles [-Joption]

JAR ファイルの抽出
jar x[v]f jarfile [inputfiles] [-Joption]
jar x[v] [inputfiles] [-Joption]

JAR ファイルの内容の表形式による一覧表示
jar t[v]f jarfile [inputfiles] [-Joption]
jar t[v] [inputfiles] [-Joption]

JAR ファイルへのインデックスの追加
jar i jarfile [-Joption]

説明

cuxtiv0Mmf
jar コマンドを制御するオプション
jarfile
作成 (c)、更新 (u)、抽出 (x)、または内容の一覧表示 (t) の対象となる JAR ファイル。f オプションとファイル名 jarfile とがペアになります。つまり、片方を記述すれば、もう一方も記述する必要があります。fjarfile を省略すると、標準入力から「JAR ファイル」が取得されるか (x および t の場合)、標準出力へ「JAR ファイル」が送信されます(c および u の場合)。
inputfiles
jarfile に結合されるか (c および u の場合)、jarfile から抽出 (x の場合) または一覧表示 (t の場合) される、空白で区切られたファイルまたはディレクトリ。すべてのディレクトリは再帰的に処理されます。このファイルは、オプション O (ゼロ) を使用しないかぎり圧縮されます。
manifest
name: value のペアが、JAR ファイルの MANIFEST.MF に含まれている既存のマニフェストファイル。m オプションとファイル名 manifest とがペアになります。つまり、片方を記述すれば、もう一方も記述する必要があります。mf の文字は、manifestjarfile を記述した順序と同じ順序で記述する必要があります。
-C dir
これに続く inputfiles 引数を処理する間、ディレクトリを dir へ一時的に変更します。複数セットの -C dir inputfiles を使用できます。
-Joption
Java 実行環境へ渡されるオプション。-Joption の間には空白を入れないでください。

説明

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

複数のファイルを JAR ファイルへ結合する一般的な使用法は次のとおりです。

% jar cf myFile.jar *.class
この例では、現在のディレクトリにあるクラス (.class) ファイルがすべて、myFile.jar という名前のファイルに格納されます。META-INF/MANIFEST.MF というマニフェストファイルエントリが jar ツールによって自動的に生成され、常に JAR ファイル内の先頭に置かれます。マニフェストファイルには、name: value のペアとして、アーカイブのメタ情報も格納されます。マニフェストファイルにメタ情報がどのようにして格納されるかについての詳細は、JAR ファイルの仕様を参照してください。

JAR アーカイブを作成する場合に jar ツールで使用したい name: value のペアを持った既存のマニフェストファイルがある場合は、次のように、m オプションを使用して、マニフェストファイルを指定できます。

% jar cmf myManifestFile myFile.jar *.class
使用する既存のマニフェストファイルが、改行文字で終わっていることを確認してください。マニフェストファイルの末尾が改行文字でない場合、ファイルの最後の行は構文解析されません。「cmf」ではなく「cfm」と指定したとき (「m」オプションと「f」オプションを逆に指定したとき) は、JAR アーカイブの名前のあとに、マニフェストファイルの名前を指定する必要があります。
% jar cfm myFile.jar myManifestFile *.class
マニフェストは、RFC822 ASCII 形式で規定されたテキスト形式であるため、マニフェストファイルの内容を簡単に表示および編集できます。

JAR ファイルからファイルを抽出するには、次のように x を使用します。

% jar xf myFile.jar

JAR ファイルから特定のファイルだけを抽出するには、そのファイル名を指定します。

% jar xf myFile.jar foo bar

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 の仕様を参照してください。

ディレクトリをコピーする標準的な方法は、まず dir1 内のファイルを標準出力に圧縮し、続いて標準入力から dir2 へ抽出します (両方の jar コマンドから f を省略する)。

% (cd dir1; jar c .)| (cd dir2; jar x)

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

オプション

c
jarfile の名前で新しいアーカイブファイルを作成するか (f が指定されている場合)、標準出力で作成します (fjarfile が省略されている場合)。inputfiles で指定されたファイルとディレクトリを、このアーカイブに追加します。
u
inputfiles で指定されたファイルとディレクトリを追加することにより、既存のファイル jarfile を更新します (f が指定されている場合)。 次に例を示します。
jar uf foo.jar foo.class
上のコマンドは、ファイル foo.class を既存の JAR ファイル foo.jar に追加します。次の例に示すように、u オプションは、マニフェストエントリも更新できます。
jar umf manifest foo.jar
name: value のペアが manifest に含まれた foo.jar マニフェストを更新します。
x
jarfile から (f が指定されている場合)、または標準入力から (fjarfile が省略されている場合)、ファイルとディレクトリを抽出します。inputfiles が指定されている場合は、その指定したファイルとディレクトリだけが抽出されます。指定されていなければ、すべてのファイルとディレクトリが抽出されます。
t
jarfile から (f が指定されている場合)、または標準入力から (fjarfile が省略されている場合)、内容を表形式で一覧表示します。inputfiles が指定されている場合は、その指定したファイルとディレクトリだけが一覧表示されます。指定されていなければ、すべてのファイルとディレクトリが一覧表示されます。
i
指定された jarfile と、それに依存する JAR ファイルについて、インデックス情報を生成します。次に例を示します。
jar i foo.jar

上のコマンドは、foo.jar 内に INDEX.LIST ファイルを生成します。このファイルには、foo.jar と、foo.jarClass-Path 属性に指定されたすべての JAR ファイルに入っている各パッケージの位置情報が書き込まれています。 インデックスの例を参照してください。

f
作成 (c)、更新 (u)、抽出 (x)、インデックス追加 (i)、または表示 (t) 対象のファイル jarfile を指定します。f オプションとファイル名 jarfile とがペアになります。つまり、片方を記述すれば、もう一方も記述する必要があります。fjarfile を省略すると、標準入力から「JAR ファイル」が取得されるか (x および t の場合)、標準出力へ「JAR ファイル」が送信されます(c および u の場合)。
v
詳細な出力を標準出力に生成します。あとでを示します。
0
(ゼロ) ZIP による圧縮を使用せずに、保存します。
M
マニフェストファイルエントリを作成しません (c および u の場合)。または、マニフェストファイルエントリが 1 つ存在する場合にそれを削除します (u の場合)。
m
META-INF/MANIFEST.MF のファイルで指定したマニフェストファイル manifestname: value の属性ペアを組み込みます。同じ名前のペアがすでに存在している場合を除いて、name: value のペアが追加されます。同じ名前のペアが存在している場合は、その値が更新されます。

コマンド行で、mf の文字は、manifestjarfile の入力順序と同じ順序で記述する必要があります。たとえば、次のようにして使います。

jar cmf myManifestFile myFile.jar *.class
デフォルトのマニフェストには含まれないマニフェストに、特別な目的の name: value の属性ペアを追加できます。この属性には、ベンダー情報、バージョン情報、パッケージのシーリングなどを記述できるほか、JAR にバンドルされたアプリケーションを実行可能にする属性を記述することもできます。m オプションの使用例は、Java チュートリアルの 「JAR Files」 および 「Notes for Developers」 ページを参照してください。
-C  dir
jar コマンドの実行中に後続の inputfiles 引数を処理するときに、一時的にディレクトリを変更します (cd dir)。この処理は、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 に追加します (この JAR ファイル内にクラスディレクトリは作成しない)。次に、元のディレクトリに戻ってから、bin ディレクトリに変更して xyz.classfoo.jar に追加します。classesbar1bar2 が保持されている場合、jar tf foo.jar を使用すると、JAR ファイルには次の要素が含められます。
META-INF/
META-INF/MANIFEST.MF
bar1
bar2
xyz.class

-Joption
Java 実行環境に option を渡します。option には、「Java アプリケーション起動ツール」のリファレンスページに記載されているオプションを 1 つ指定します。たとえば、-J-Xmx48M と指定すると、最大メモリは 48M バイトに設定されます。-J を使って背後の実行環境にオプションを渡すことはよく行われています。

コマンド行引数ファイル

jar のコマンド行を短くしたり簡潔にしたりするために、jar コマンドに対する引数 (-J オプションを除く) を含む 1 つ以上のファイルを指定することができます。これにより、任意の長さの jar コマンドを作成でき、オペレーティングシステムによるコマンド行の制限から解放されます。

引数ファイルにはオプションとファイル名を含めることができます。ファイル内の各引数は、スペースまたは改行で区切ります。引数ファイル内のファイル名は、現在のディレクトリから見た相対パスになります。引数ファイルの位置から見た相対パスではありません。ワイルドカード (*) は、通常ならばオペレーティングシステムシェルによってあらゆる文字に解釈されますが、この場合は解釈されません。引数ファイル内の引数で @ 文字を使用して、複数のファイルを再帰的に解釈することはサポートされていません。また、-J オプションもサポートされていません。このオプションは起動ツールに渡されますが、起動ツールでは引数ファイルをサポートしていないからです。

jar を実行するときに、各引数ファイルのパスとファイル名の先頭に @ 文字を付けて渡します。jar は、@ 文字で始まる引数を見つけると、そのファイルの内容を展開して引数リストに挿入します。

たとえば、次のようにして、「classes.list」という単一の引数ファイルに、複数のファイルの名前を保存します。

% find .-name '*.class' -print > classes.list

続いて、この引数ファイル内のファイル名を渡す jar コマンドを実行します。

% jar cf my.jar @classes.list
引数ファイルは、パスを付けて渡すことができますが、相対パスを付けた引数ファイル内部のすべてのファイル名には、渡されるパスではなく、現在の作業用ディレクトリに対する相対パスが付けられます。 この例を次に示します。
% jar @path1/classes.list

特定のディレクトリ内のすべてのファイルをアーカイブに追加する (そのアーカイブがすでに存在する場合は、その内容を上書きする) には、次のようにします。v オプションを使用して詳細に列挙すると、サイズや最新の更新日など、アーカイブ内のファイルについての詳細情報を得ることができます。
% ls
1.au          Animator.class    monkey.jpg
2.au          Wave.class        spacemusic.au
3.au          at_work.gif

% jar cvf bundle.jar *
added manifest
adding:1.au(in = 2324) (out= 67)(deflated 97%)
adding:2.au(in = 6970) (out= 90)(deflated 98%)
adding:3.au(in = 11616) (out= 108)(deflated 99%)
adding:Animator.class(in = 2266) (out= 66)(deflated 97%)
adding:Wave.class(in = 3778) (out= 81)(deflated 97%)
adding:at_work.gif(in = 6621) (out= 89)(deflated 98%)
adding:monkey.jpg(in = 7667) (out= 91)(deflated 98%)
adding:spacemusic.au(in = 3079) (out= 73)(deflated 97%)
すでに画像、オーディオファイル、およびクラス用のサブディレクトリに分けている場合は、これらを単一の JAR ファイルに結合できます。
% ls -F
audio/ classes/ images/

% jar cvf bundle.jar audio classes images
added manifest
adding:audio/(in = 0) (out= 0)(stored 0%)
adding:audio/1.au(in = 2324) (out= 67)(deflated 97%)
adding:audio/2.au(in = 6970) (out= 90)(deflated 98%)
adding:audio/3.au(in = 11616) (out= 108)(deflated 99%)
adding:audio/spacemusic.au(in = 3079) (out= 73)(deflated 97%)
adding:classes/(in = 0) (out= 0)(stored 0%)
adding:classes/Animator.class(in = 2266) (out= 66)(deflated 97%)
adding:classes/Wave.class(in = 3778) (out= 81)(deflated 97%)
adding:images/(in = 0) (out= 0)(stored 0%)
adding:images/monkey.jpg(in = 7667) (out= 91)(deflated 98%)
adding:images/at_work.gif(in = 6621) (out= 89)(deflated 98%)

% ls -F
audio/ bundle.jar classes/ images/
JAR ファイルのエントリ名を表示するには、「t」オプションを使用します。
% jar tf bundle.jar
META-INF/
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

クラスロードを高速にするためにインデックスファイルを JAR ファイルに追加するには、「i」オプションを使用します。

株取引アプリケーション用の相互依存したクラスを、3 つの JAR ファイル、main.jarbuy.jar、および sell.jar に分割してみましょう。次のように main.jar でクラスパス属性を指定します。
Class-Path:buy.jar sell.jar
続いて次のように i オプションを使用すると、アプリケーションのクラスロードを高速化できます。
% jar i main.jar
この場合、INDEX.LIST ファイルが META-INF ディレクトリに追加されます。これにより、アプリケーションのクラスローダがクラスまたはリソースを検索する際に、指定された JAR ファイルをダウンロードできるようになります。

関連項目

「JAR ファイルの概要」
「JAR ファイルの仕様」
「JAR インデックス」
「JAR チュートリアル」 (Java ソフトウェアの Web サイト内)
「pack200 リファレンスページ」

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

Sun
Java ソフトウェア