jar(1)

名前
jar - Java ARchive ツール

jar は複数のファイルを 1 つの JAR アーカイブファイルに結合します。

    o   形式

    o   説明

    o   オプション

    o   コマンド行引数ファイル

    o   例

    o   関連項目

形式

    JAR ファイルの作成
        jar c[v0Mmfe] [manifest] [jarfile] [entrypoint] [-C dir] inputfiles [-Joption]

    JAR ファイルの更新
        jar u[v0Mmfe] [manifest] [jarfile] [entrypoint] [-C dir] inputfiles [-Joption]

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

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

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

説明

    cuxtiv0Mmfe
        jar コマンドを制御するオプション

    jarfile
        作成 (c)、更新 (u)、抽出 (x)、または目次表示 (t) の対象となる JAR ファイル。f オプションとファイル名 jarfile とがペアになります。 つまり、片方を記述すれば、もう一方も記述する必要があります。 f と jarfile を省略すると、標準入力から「JAR ファイル」が取得されるか (x および t の場合)、標準出力へ「JAR ファイル」が送信されます(c および u の場合)。

    inputfiles
        jarfile に結合されるか (c および u の場合)、jarfile から抽出 (x の場合) または一覧表示 (t の場合) される、空白で区切られたファイルまたはディレクトリ。すべてのディレクトリは再帰的に処理されます。このファイルは、オプション 0 (ゼロ) を使用しないかぎり圧縮されます。

    manifest
        JAR ファイルの MANIFEST.MF 内に含めるべき name: value ペアが含まれている既存のマニフェストファイル。m オプションとファイル名 manifest とがペアになります。つまり、片方を記述すれば、もう一方も記述する必要があります。m、f、および e の出現順序は、manifest、jarfile、entrypoint の出現順序と一致する必要があります。

    entrypoint
        実行可能 JAR ファイル内にバンドルされたスタンドアロンアプリケーションのアプリケーションエントリポイントとして設定するクラスの名前。-e オプションと entrypoint は対になっています。どちらかを指定する場合は両方とも指定する必要があります。m、f、および e の出現順序は、manifest、jarfile、entrypoint の出現順序と一致する必要があります。

    -C dir
        これに続く inputfiles 引数を処理する間、ディレクトリを dir へ一時的に変更します。 -C - dir inputfiles のセットは複数使用できます。

    -Joption
        Java 実行環境へ渡されるオプション。-J と option の間には空白を入れないでください。

説明

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

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

% jar cf myFile.jar *.class

この例では、現在のディレクトリにあるクラス (.class) ファイルがすべて、myFile.jar という名前のファイルに格納されます。jar ツールは自動的に、 META-INF/MANIFEST.MF という名前のマニフェストファイルエントリを生成します。これは常に、JAR ファイルの最初のエントリになります。マニフェストファイルは、アーカイブに関するメタ情報を宣言し、そのデータを name : value ペアとして格納します。jar ツールがマニフェストファイル内にメタ情報を格納する方法の詳細については、「 JAR file specification @
http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html#JAR%20Manifest」を参照してください。

既存のマニフェストファイル内に格納された name : value ペアを JAR ファイルに含める必要がある場合には、そのファイルを次のように -m オプションを使って指定します。

% jar cmf myManifestFile myFile.jar *.class

既存のマニフェストファイルは改行文字で終わっている必要があります。マニフェストファイルが改行文字で終わっていないと、jar はその最終行を解析しません。

注: コマンド行に cmf ではなく cfm が指定された jar コマンド (m と -f オプションの順番を逆にする) の場合、jar コマンド行にまず JAR アーカイブの名前を指定し、続いてマニフェストファイルの名前を指定する必要があります。 次に例を示します。

% jar cfm myFile.jar myManifestFile *.class

マニフェストは、RFC822 ASCII 形式で規定されたテキスト形式であるため、マニフェストファイルの内容を簡単に表示および編集できます。

JAR ファイルからファイルを抽出する場合は、 x を使用します。

% jar xf myFile.jar

jar ファイルから個別のファイルを抽出する場合は、そのファイル名を指定します。

% jar xf myFile.jar foo bar

JDK のバージョン 1.3 以降から、jar ユーティリティーで JarIndex @
http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html#JAR_Index がサポートされています。 JarIndex を使用すると、アプリケーションのクラスローダーで JAR ファイルからクラスがロードされるときの効率が向上します。アプリケーションまたはアプレットが複数の JAR ファイルにバンドルされている場合は、クラスがロードされるときに、必要な JAR ファイル以外のダウンロードおよびオープンは行われません。このパフォーマンスの最適化は、新しい -i オプションを指定して jar を実行すると有効になります。このオプションを使うと、指定した JAR メインファイルと、そのメインファイルが依存しているすべての JAR ファイルについて、パッケージ位置情報が生成されます。メインファイルが依存している JAR ファイルは、JAR メインファイルのマニフェストの Class-Path 属性に指定しておく必要があります。

% jar i main.jar

この例では、 INDEX.LIST ファイルが main.jar の META-INF ディレクトリ内に挿入されます。
このファイルに格納されている情報を使用して、アプリケーションのクラスローダーは、効率的にクラスをロードします。インデックスファイルに位置情報を格納する方法の詳細は、「JarIndex 仕様」を参照してください。
ディレクトリをコピーするには、まず dir1 内のファイルを圧縮して stdout に出力し、続いて stdin から抽出して dir2 に出力します (-f オプションはどちらの jar コマンドでも省略)。

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

jar を使用して JAR ファイルや JAR マニフェストファイルを操作するサンプルコマンドを確認したい場合は、後述の「例」を参照してください。また、「 Java Tutorial @
http://download.oracle.com/javase/tutorial/deployment/jar」の JAR コースも参照してください。

オプション

    c   f が指定された場合は jarfile という名前の 新しい アーカイブファイルを 作成し、 f と jarfile が省略された場合は標準出力に情報を出力します。inputfiles で指定されたファイルとディレクトリを、このアーカイブに追加します。

    u   f が指定されている場合に、既存ファイル jarfile を 更新する目的で、 inputfiles に指定されたファイルやディレクトリを追加します。次に例を示します。

        jar uf foo.jar foo.class

        上のコマンドは、ファイル foo.class を既存の JAR ファイル foo.jar に追加します。次の例に示すように、-u オプションは、マニフェストエントリも更新できます。

        jar umf manifest foo.jar

        foo.jar マニフェストをマニフェスト内の name:value ペアで更新します。

    x   f が指定された場合は jarfile から 、 f と jarfile が省略された場合は標準入力から、ファイルやディレクトリを抽出します。inputfiles が指定されている場合は、その指定したファイルとディレクトリだけが抽出されます。指定されていなければ、すべてのファイルとディレクトリが抽出されます。抽出されたファイルの日時は、アーカイブ内で設定されたものです。

    t   f が指定された場合は jarfile から 、 f と jarfile が省略された場合は標準入力から、目次を表示します。inputfiles が指定されている場合は、その指定したファイルとディレクトリだけが一覧表示されます。指定されていなければ、すべてのファイルとディレクトリが一覧表示されます。

    i   指定された jarfile と、それに依存する JAR ファイルについて、インデックス情報を生成します。たとえば、

        jar i foo.jar

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

    f   次の各処理の対象となるファイル jarfile を指定します。作成 (c)、更新 (u)、抽出 (x)、インデックス追加 (i)、または表示 (t)。f オプションとファイル名 jarfile とがペアになります。 つまり、片方を記述すれば、もう一方も記述する必要があります。Omitting f と jarfile を省略すると、x や t の場合は 標準入力から JAR ファイル名が取得され、c や u の場合は 標準出力 に JAR ファイルが送信されます。

    v   詳細な出力を標準出力に生成します。あとで例を示します。

    0   (ゼロ) ZIP による圧縮を使用せずに、保存します。

    M   マニフェストファイルエントリを作成しません (c および u の場合)。または、マニフェストファイルエントリが存在する場合にそれを削除します (u の場合)。

    m   META-INF/MANIFEST.MF のファイルで指定したマニフェストファイル manifest の name : value の属性ペアを組み込みます。 jar は、すでに同じ名前で存在しないかぎり、その name:value ペアを追加します。同じ名前で存在する場合、 jar はその値を更新します。

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

    jar cmf myManifestFile myFile.jar *.class

    デフォルトのマニフェストには含まれないマニフェストに、特別な目的の name : value の属性ペアを追加できます。たとえば、ベンダー情報、バージョン情報、パッケージシーリング、または JAR にバンドルされたアプリケーションを実行するための属性を追加できます。「Java Tutorial」の「 JAR Files @
    http://download.oracle.com/javase/tutorial/deployment/jar/」コースを参照し、 -m オプションの使用例を確認してください。

    e   実行可能 JAR ファイル内にバンドルされたスタンドアロンアプリケーションのアプリケーションエントリポイントとして、entrypoint を設定します。このオプションを使用すると、マニフェストファイル内の Main-Class 属性値が作成または上書きされます。このオプションは、JAR ファイルの作成中または更新中に使用できます。このオプションを使えば、マニフェストファイルを編集または作成することなしに、アプリケーションのエントリポイントを指定できます。
        たとえば、次のコマンドでは Main.jar が作成されますが、その際、マニフェスト内の Main-Class 属性値は Main に設定されます。

        jar cfe Main.jar Main Main.class

    次のコマンドを実行すると java ランタイムから直接このアプリケーションを起動できます。

    java -jar Main.jar

    あるパッケージ内にエントリポイントのクラス名が含まれている場合、ドット (「.」) 、スラッシュ (「/」) のいずれかの文字をその区切り文字として使用できます。たとえば、 Main.class が foo という名前のパッケージに含まれている場合、エントリポイントは次のようにして指定できます。

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

    または

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

    注: -m オプションと -e オプションの両方を同時に指定した場合、指定したマニフェストにも Main-Class 属性が含まれていれば、 Main.class の指定があいまいになってエラーや発生し、JAR の作成処理や更新処理が異常終了します。

    -C  dir
        jar コマンドの実行中に後続の inputfiles 引数を処理するときに、一時的にディレクトリを変更します (cd dir)。この処理は、UNIX の tar ユーティリティーの -C オプションの機能に類似しています。
        たとえば、次のコマンドは、classes ディレクトリに移動し、そのディレクトリから bar.class を foo.jar に追加します。

        jar uf foo.jar -C classes bar.class

        次のコマンドでは、classes ディレクトリに移動し、classes ディレクトリ内のすべてのファイルを foo.jar に追加します (jar ファイルには classes ディレクトリを作成しません)。次に元のディレクトリに戻ってから、bin ディレクトリに移動し、xyz.class を foo.jar に追加します。

        jar uf foo.jar -C classes .-C bin xyz.class

        classes にファイル bar1 と bar2 が格納されている場合に、 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 コマンドによって出力されたファイルの名前が格納されます。

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

次に、引数ファイル構文を使用して classes.list を jar に渡すことで、 そのリスト に対して 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」オプションを使用します。
例:

たとえば、株取引アプリケーションの内部依存しているクラスを、main.jar、buy.jar、および sell.jar という 3 つの JAR ファイルに分割したとします。

main.jar のマニフェストの Class-path 属性に次のように指定した場合、

Class-Path: buy.jar sell.jar

-i オプションを使用すれば、アプリケーションのクラスの 読み込みを高速化できます。

% jar i main.jar

INDEX.LIST ファイルが META-INF ディレクトリに挿入されます。この結果、アプリケーションのクラスローダーによってクラスまたはリソースの検索が行われるときに、適切な jar ファイルがダウンロードされます。

関連項目

JAR ファイルの概要 @
http://java.sun.com/javase/6/docs/technotes/guides/jar/jarGuide.html

JAR ファイルの仕様 @
http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html

JarIndex の仕様 @
http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html#JAR_Index

JAR チュートリアル @
http://download.oracle.com/javase/tutorial/deployment/jar/index.html

pack200(1)