jar(1)

名前
jar - Java アーカイブツール

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

形式

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
        jar ファイル に結合 (c および u の場合)、または jar ファイル から抽出 (x の場合) または一覧表示 (t の場合) されるファイル またはディレクトリ。空白文字で区切ります。 すべてのディレクトリは再帰的に処理されます。 オプション 0 (ゼロ) が使用されない場合は、ファイルが圧縮されます。

    manifest
        jar ファイルの MANIFEST.MF に含めようとする名前:値ペアが含まれている 既存の manifest ファイルです。 -m オプションと manifest のファイル名は対になっています。 使用する場合は、両方を一緒に使用します。 文字 m 、 f 、および e の出現順序は、 manifest 、 jarfile 、および entrypoint の出現順序と一致する必要があります。

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

    -C dir
        後続の入力ファイル引数の処理中、 ディレクトリを dir に一時的に変更します。 複数の -C dir 入力ファイルのセットを使用できます。

    -Joption
        Java Runtime Environment に渡されるオプション ( -J と option の間には空白文字を入れないでください)。

機能説明
jar ツールは Java アプリケーションの 1 つで、複数個のファイルを 1 個の JAR アーカイブファイルに統合します。また、 jar は汎用的なアーカイブ作成用 および圧縮用のツールでもあり、圧縮は ZIP または ZLIB
 (http://www.gzip.org/zlib/) 形式で行います。 ただし jar ツールの主な目的は、いくつかの Java アプレットやアプリケーションを 1 個のアーカイブに統合することです。 アプレットやアプリケーションのコンポーネント、たとえば クラスファイル、イメージ、サウンドなどを単一のアーカイブに まとめると、ブラウザのような Java エージェントにダウンロードするときに、一度の HTTP トランザクションで済みます。コンポーネントごとに 新たに接続する必要がありません。 これによりダウンロード時間が大幅に短縮できます。 また jar はファイルの圧縮も行うので、ダウンロードがより高速になります。 さらに、ファイル中の個々のエントリに対してアプレットの作成者が 署名できるので、作成元を明確化できます。 jar ツールの構文は、 tar コマンドの構文とほぼ同一です。 jar アーカイブは、圧縮されているかどうかにかかわらず、 クラスパス
 (http://java.sun.com/javase/6/docs/technotes/tools/solaris/classpath.html) エントリとして使用できます。

複数のファイルを jar ファイルに統合する標準的な使い方は次のとおりです。

    % jar cf myFile.jar *.class

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

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

    % jar cmf myManifestFile myFile.jar *.class

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

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

    % jar cfm myFile.jar myManifestFile *.class

manifest は RFC822 ASCII 形式に基づいたテキスト形式を使用するため、manifest ファイルの内容は 簡単に表示および処理できます。

jar ファイルからファイルを抽出する場合は、 x を使用します。次に例を示します。

    % jar xf myFile.jar

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

    % jar xf myFile.jar foo bar

JDK のバージョン 1.3 から、jar ユーティリティで
http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html#JAR%20Index の「 JarIndex 」をサポートするようになりました。 これにより、 アプリケーションのクラスローダは、jar ファイルから クラスをより高速に読み込めるようになりました。 アプリケーションまたはアプレットが複数の jar ファイルに バンドルされている場合、必要な jar ファイルだけがダウン ロードされて開かれ、クラスが読み込まれます。 このパフォーマンスの最適化は、 jar を -i オプションを使用して実行すると有効になります。 指定した メインの jar ファイルおよびそのファイルが依存している すべての jar ファイルのパッケージ位置情報が生成されます。 これらの情報は、メイン jar ファイルの manifest の 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 ファイルや JAR ファイルマニフェストを操作するコマンドサンプルを確認するには、「例」を参照してください。また、
http://java.sun.com/docs/books/tutorial/jar の 「Java Tutorial」の JAR コースも参照してください。

オプション

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

u   既存の jarfile ( f を指定した場合) を更新します。 このとき、この jarfile には入力ファイルで指定されたファイルおよびディレクトリが追加されます。以下に例を示します。

    % jar uf foo.jar foo.class

この例では、ファイル foo.class が既存の jar ファイル foo.jar に追加されます。 u オプションでは、マニフェストのエントリを更新することもできます。以下に例を示します。

    % jar umf manifest foo.jar

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

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

t   jarfile ( f を指定した場合)、または標準入力 ( f と jarfile を省略した場合) から内容をリストします。入力ファイルを指定した場合、 その入力ファイルで指定されたファイルおよびディレクトリだけが リストされます。指定しない場合は、すべてのファイルおよびディレクトリがリストされます。

i   指定された jarfile および関連づけられている jar ファイルの インデックス情報を生成します。次に例を示します。

    % jar i foo.jar

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

f   作成 (c)、更新 (u)、抽出 (x)、インデックス作成(i)、 または表示 (t) する jarfile を指定します。 -f オプションと jarfile のファイル名は対になっています。 使用する場合は、両方を一緒に使用します。 f と jarfile を省略すると、標準入力から jar ファイル名が 使用されたり (x および t の場合)、標準出力に jar ファイルが 送信されたりします (c および u の場合)。

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

0   ゼロ。ZIP 圧縮を使用せずに格納します。

M   manifest ファイルエントリを作成しません (c および u の場合)。または すでに存在する manifest ファイルエントリを削除します (u の場合)。

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

コマンド行では、文字 m と f は、 manifest と jarfile が出現するのと 同じ順序で使用します。次に例を示します。

    % jar cmf myManifestFile myFile.jar *.class

manifest ファイルには、デフォルトのマニフェストに含まれていない、 専用の名前:値属性ペアを追加できます。 たとえば、 ベンダー情報、バージョン情報、パッケージシーリング、 または JAR にバンドルされたアプリケーションを実行するための属性を 追加できます。 -m オプションの使用例については、「Java Tutorial」
http://java.sun.com/docs/books/tutorial/jar/ にある 「 JAR Files 」コースを参照してください。

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 コマンドの実行中に一時的にディレクトリを変更します ( cd dir )。 このとき、後続の入力ファイル引数が処理されます。 この動作は、UNIX の tar ユーティリティの -C オプションと 同様の動作になります。 たとえば、次のコマンドは、 classes ディレクトリに移動し、そのディレクトリから bar.classes を 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
    option を Java Runtime Environment に渡します。 ここで、 option は、Java アプリケーション起動プログラムのマニュアルページ
     (http://java.sun.com/javase/6/docs/technotes/tools/solaris/java.html#options) で説明されているオプションの 1 つです。 たとえば -J-Xms48m は、最大メモリを 48M バイトに設定します。 -J が基本にする仮想マシンにオプションを渡すことは、共通の規約です。

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

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

jar の実行時、各引数ファイルのパスおよび名前の先頭に @ 文字を付けて渡します。 jar で先頭に文字 @ の付いた引数が出現するたびに、 そのファイルの内容が引数リストに展開されます。
次の例では、 find コマンドから出力されたファイル名を classes.list 内に格納しています。

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

その後、引数ファイル構文を使って jar にリストを渡すと、 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/
次の例では、 t オプションを指定して、jar ファイル中のエントリ名を表示します。
    % 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 ファイルがダウンロードされます。

関連項目

http://java.sun.com/javase/6/docs/technotes/guides/jar/jarGuide.html の 「 The Jar Overview 」

http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html の 「 The Jar File Specification 」

http://java.sun.com/javase/6/docs/technotes/guides/jar/jar.html#JAR%20Index の 「 The JarIndex Spec 」

http://java.sun.com/docs/books/tutorial/jar の 「 Jar Tutorial 」 (Java ソフトウェアの Web サイト内)

http://java.sun.com/javase/6/docs/technotes/tools/share/pack200.html の 「 pack200 Reference Page 」