jar(1)

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

形式
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 ]

パラメータ

cuxtivOMmf
    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 は、 manifest と jarfile が出現する順序と 同じ順序で指定する必要があります。

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

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

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

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

    % jar cf myFile.jar *.class

この例では、現在のディレクトリ中のすべてのクラスファイルが myjarfile という名前のファイルに置かれます。 META-INF/MANIFEST.MF という名前の manifest ファイルは jar ツールが 自動的に生成し、常に jar ファイルの先頭のエントリとなります。 manifest ファイルには、アーカイブに関するすべてのメタ情報が 名前:値ペアとして記録されます。 どのように記録されるかについては、 「Jar ファイル仕様」 を参照してください。

既存の manifest ファイルの名前:値ペアを含んだ新たな jar アーカイブを jar ツールで作成したいときは、 m オプションを使ってその manifest ファイルを 指定します。以下に例を示します。

    % jar cmf myManifestFile myJarFile *.class

使用する既存の manifest ファイルは復帰改行で終わるようにしてください。 manifest ファイルの最後の行は、復帰改行文字で終わっていないと、 構文解析されません。 cmf ではなく cfm を指定する場合 (つまり、 m オプションと f オプションの順番を 逆にする場合)、最初に jar アーカイブ名を指定し、次に manifest ファイル名を指定する 必要があります。

    % jar cfm myJarFile myManifestFile *.class

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

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

    % jar xf myFile.jar

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

    % jar xf myFile.jar foo bar

JDK のバージョン 1.3 から、jar ユーティリティで 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 ファイルのマニフェストを操作する方法の例は、 以下の説明と、「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 を指定します。 オプションと jarfile のファイル名は対になっています。 使用する場合は、両方を一緒に使用します。 f と jarfile を省略すると、標準入力から「jar ファイル」が 使用されたり (x および t の場合)、標準出力にこの「jar ファイル」が 送信されたりします (c および u の場合)。

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

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

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

m   META-INF/MANIFEST.MF 内の指定した manifest ファイルから 名前:値属性をインクルードします。 すでに同じ名前で存在しない限り、その名前:値ペアが追加されます。同じ名前で存在する場合は、その値が更新されます。

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

    % jar cmf myManifestFile myFile.jar *.class

manifest ファイルには、デフォルトのマニフェストに含まれていない、 専用の名前:値属性ペアを追加できます。このような属性ペアの 例としては、ベンダ情報、バージョン情報、パッケージシーリング、 および JAR に含まれるアプリケーションを実行するための属性が あります。 m オプションの使用例については、「Java Tutorial」の「JAR Files」節と 「JRE 開発者向けノート」を参照してください。

-C  jar コマンドの実行中に一時的にディレクトリを変更します ( cd dir )。 このとき、後続の入力ファイル引数が処理されます。 この動作は、UNIX の tar ユーティリティの -C オプションと 同様の動作になります。次に例を示します。

    % jar uf foo.jar -C classes bar.classes

classes ディレクトリに移動し、そのディレクトリから bar.classes を foo.jar に追加します。

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

このコマンドでは、classes ディレクトリに移動し、classes ディレクトリ内のすべてのファイルを foo.jar に追加します (jar ファイルには classes ディレクトリを作成しません)。 次に元のディレクトリに戻ってから、bin ディレクトリに移動し、xyz.class を foo.jar に追加します。 classes にファイル bar1 および bar2 がある場合、 jar tf foo.jar を実行すると、 jar ファイルの内容が次のように表示されます。

    META-INF/
    META-INF/MANIFEST.MF
    bar1
    bar2
    xyz.class

J option
    option を Java Runtime Environment に渡します。ここで、 option は、Java アプリケーション起動プログラム java(1) のマニュアルページで 説明されているオプションの 1 つです。たとえば -J-Xms48m は、起動メモリを 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/
次の例では、 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 ファイルがダウンロードされます。

関連項目

JAR Overview @
    http://java.sun.com/j2se/1.5.0/docs/guide/jar/jarGuide.html/

JAR Files Specification @
    http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html/

JARIndex Spec @
    http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html/

JAR Tutorial @
    http://java.sun.com/docs/books/tutorial/jar/

pack200 Reference Page @
    http://java.sun.com/j2se/1.5.0/tooldocs/solaris/pack200.html/