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

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

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

% jar cmf myManifestFile myFile.jar *.class

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

注意: コマンドラインにcmfではなくcfmが指定された(mと-fオプションの順番を逆にした)jarコマンドの場合、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://docs.oracle.com/javase/7/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チュートリアル @
http://docs.oracle.com/javase/tutorial/deployment/jar/のJARトライアルも参照してください。

オプション

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

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

        jar uf foo.jar foo.class

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

        jar umf manifest foo.jar

        上のコマンドは、foo.jarマニフェストをmanifest内のname : valueのペアで更新します。

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

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

    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を省略すると、stdinからJARファイル名が取得される(xおよびtの場合)か、stdoutにJARファイルが出力されます(cおよびuの場合)。

    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にバンドルされたアプリケーションを実行可能にするための属性を追加できます。-mオプションの使用例は、Javaチュートリアルの JARファイルでのプログラムのパッケージ化 @
        http://docs.oracle.com/javase/tutorial/deployment/jar/のレッスンを参照してください。

    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://docs.oracle.com/javase/7/docs/technotes/guides/jar/jarGuide.html

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

JarIndexの仕様 @
http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#JAR_Index

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

pack200(1)