jar(1) 基本ツール jar(1)

# 名前

jar - Java Archive (JAR)ファイルを操作します。

# 概要

JARファイルの作成

```
jar c[efmMnv0] [entrypoint] [jarfile] [manifest] [-C dir] file ... [-Joption ...] [@arg-file ...]
```

JARファイルの更新

```
jar u[efmMnv0] [entrypoint] [jarfile] [manifest] [-C dir] file ... [-Joption ...] [@arg-file ...]
```

JARファイルの抽出

```
jar x[vf] [jarfile] file ... [-Joption ...] [@arg-file ...]
```

JARファイルのコンテンツのリスト

```
jar t[vf] [jarfile] file ... [-Joption ...] [@arg-file ...]
```

JARファイルへの索引の追加

```
jar i jarfile [-Joption ...] [@arg-file ...]
```

# 説明

**jar**コマンドは、ZIPおよびZLIB圧縮形式に基づく汎用のアーカイブおよび圧縮ツールです。ただし、**jar**コマンドは、主にいくつかのJavaアプレットやアプリケーションを単一のアーカイブにパッケージ化するように設計されました。アプレットやアプリケーションのコンポーネント(ファイル、イメージ、およびサウンド)が1つのアーカイブに結合されていると、Javaエージェント(ブラウザなど)は、それらのコンポーネントを1回のHTTPトランザクションでダウンロードすることができ、コンポーネントごとに新しい接続が不要になります。これにより、ダウンロード時間が大幅に短縮されます。また、**jar**コマンドはファイルの圧縮も行うため、ダウンロード時間がさらに短縮されます。また、**jar**コマンドによって、ファイル内の個々のエントリにアプレット作成者による署名を書き込めるため、配布元の認証が可能になります。JARファイルは、圧縮されているかどうかにかかわらず、クラス・パスのエントリとして使用できます。

**jar**コマンドの構文は、**tar**コマンドの構文に似ています。必須の*操作の引数*の1つで定義された複数の操作モードがあります。他の引数は、操作の動作を変更する*オプション*、または操作を実行するために必要な*オペランド*を使用します。

# 操作の引数

**jar**コマンドを使用する場合は、次の操作の引数のいずれかを指定して実行される操作を選択する必要があります。コマンド行で他の1文字のオプションと混在させることができますが、通常、操作の引数は指定される最初の引数です。

c

新しいJARアーカイブを作成します。

i

JARアーカイブの索引情報を生成します。

t

JARアーカイブのコンテンツをリストします。

u

JARアーカイブを更新します。

x

JARアーカイブからファイルを抽出します。

# オプション

次のオプションを使用して、JARファイルを作成、更新、抽出または表示する方法をカスタマイズします。

e

*entrypoint*オペランドで指定されるクラスを、実行可能JARファイルにバンドルされるスタンドアロンJavaアプリケーションのエントリ・ポイントに設定します。このオプションを使用すると、マニフェスト・ファイル内の**Main-Class**属性値が作成またはオーバーライドされます。**e**オプションは、JARファイルの作成時(**c**)または更新時(**u**)に使用できます。

たとえば、次のコマンドでは、**Main.jar**アーカイブが**Main.class**ファイルとともに作成されますが、その際、マニフェスト内の**Main-Class**属性値は**Main**に設定されます。

```
jar cfe Main.jar Main Main.class


 
```

Java Runtime Environment (JRE)は、次のコマンドを実行して、このアプリケーションを直接呼び出すことができます。

```
java -jar Main.jar


 
```

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

```
jar -cfe Main.jar mydir/Main mydir/Main.class
jar -cfe Main.jar mydir.Main mydir/Main.class


 
```

**注記**

注意 特定のマニフェストにも**Main-Class**属性が含まれている場合に**m**オプションと**e**オプションの両方を同時に指定すると、**Main-Class**の指定があいまいになります。このあいまいさによってエラーが発生し、**jar**コマンドの作成や更新の操作が終了します。

f

*jarfile*オペランドで指定されたファイルを、作成(**c**)、更新(**u**)、抽出(**x**)または表示(**t**)されるJARファイルの名前に設定します。**f**オプションおよび*jarfile*オペランドを省略すると、**jar**コマンドに、**stdin**からのJARファイル名を受け入れるか(**x**および**t**の場合)、JARファイルを**stdout**に送信すること(**c**および**u**の場合)が指示されます。

m

(**META-INF/MANIFEST.MF**のアーカイブにある) **jar**コマンドのマニフェスト・ファイルの**manifest**オペランドで指定されたファイルから、属性の名前と値のペアを含めます。**jar**コマンドは、同じ名前のエントリがすでに存在する場合を除き、属性の名前と値をJARファイルに追加します。同じ名前のエントリがすでに存在する場合、**jar**コマンドは属性の値を更新します。**m**オプションは、JARファイルの作成時(**c**)または更新時(**u**)に使用できます。

デフォルトのマニフェスト・ファイルには含まれないマニフェストに、特別な目的の名前-値の属性ペアを追加できます。たとえば、ベンダー情報、リリース情報、パッケージ・シーリングを指定する属性、またはJARにバンドルされたアプリケーションを実行可能にするための属性を追加できます。**m**オプションの使用例は、http://docs.oracle.com/javase/tutorial/deployment/jar/index.htmlにある プログラムのパッケージ化に関する項を参照してください。

M

マニフェスト・ファイル・エントリを作成しない(**c**および**u**の場合)か、またはマニフェスト・ファイル・エントリが存在する場合は削除します(**u**の場合)。**M**オプションは、JARファイルの作成時(**c**)または更新時(**u**)に使用できます。

n

JARファイルの作成(**c**)時に、このオプションは、コンテンツが[pack200(1)](/man/os/openjdk-8/pack200.1)コマンドのパックおよびアンパック操作の影響を受けないようにアーカイブを正規化します。この正規化を使用しない場合、署名付きJARの署名は無効になります。

v

詳細な出力を標準出力に生成します。例を参照してください。

0

(ゼロ) ZIP圧縮を使用しないでJARファイルを作成(**c**)または更新(**u**)します。

-C *dir*

JARファイルの作成(**c**)または更新(**u**)時に、このオプションは*file*オペランドで指定されたファイルの処理中にディレクトリを一時的に変更します。この操作は、**tar**ユーティリティの**-C**オプションと同様になることを目的としています。たとえば、次のコマンドによって、**classes**ディレクトリに変更され、そのディレクトリから**my.jar**に**Bar.class**ファイルが追加されます。

```
jar uf my.jar -C classes Bar.class


 
```

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

```
jar uf my.jar -C classes . -C bin Xyz.class


 
```

**classes**に**bar1**ファイルと**bar2**ファイルが含まれている場合、前述のコマンドを実行した後、JARファイルには次のものが含まれます。

```
% jar tf my.jar
META-INF/
META-INF/MANIFEST.MF
bar1
bar2
Xyz.class


 
```

-J*option*

指定したJVMオプションを、JREがJARファイルを実行する際に使用するように設定します。JVMオプションは、[java(1)](/man/os/openjdk-8/java.1)コマンドのリファレンス・ページで説明されています。たとえば、**-J-Xms48m**と指定すると、スタートアップ・メモリーは48MBに設定されます。

# オペランド

次のオペランドは、**jar**コマンドで認識されます。

*file*

JARファイルの作成(**c**)または更新(**u**)時に、*file*オペランドは、アーカイブに追加する必要のあるファイルまたはディレクトリのパスと名前を定義します。JARファイルの抽出(**x**)またはコンテンツのリスト(**t**)時に、*file*オペランドは抽出またはリストするファイルのパスと名前を定義します。少なくとも1つの有効なファイルまたはディレクトリを指定する必要があります。複数の*file*オペランドを空白で区切ります。*entrypoint*、*jarfile*または*manifest*オペランドが使用される場合は、その後に*file*オペランドを指定する必要があります。

*entrypoint*

JARファイルの作成(**c**)または更新(**u**)時に、*entrypoint*オペランドは、実行可能JARファイルにバンドルされているスタンドアロンJavaアプリケーションのエントリ・ポイントとなるクラスの名前を定義します。**e**オプションが存在する場合は*entrypoint*オペランドを指定する必要があります。

*jarfile*

作成(**c**)、更新(**u**)、抽出(**x**)または表示(**t**)するファイルの名前を定義します。**f**オプションが存在する場合は*jarfile*オペランドを指定する必要があります。**f**オプションおよび*jarfile*オペランドを省略すると、**jar**コマンドに、**stdin**からのJARファイル名を受け入れるか(**x**および**t**の場合)、JARファイルを**stdout**に送信すること(**c**および**u**の場合)が指示されます。

JARファイルを索引付け(**i**)する場合は、**f**オプションを指定しないで*jarfile*オペランドを指定します。

*manifest*

JARファイルの作成(**c**)または更新(**u**)時に、*manifest*オペランドはJARファイルの**MANIFEST.MF**に含める属性の名前と値を持つ既存のマニフェスト・ファイルを定義します。**f**オプションが存在する場合は*manifest*オペランドを指定する必要があります。

*@arg-file*

**jar**コマンドを短縮または簡素化するには、別のテキスト・ファイル内の引数を指定し、接頭辞としてアットマーク(@)を付けて**jar**コマンドに渡すことができます。**jar**コマンドは、アットマーク文字で始まる引数を見つけると、そのファイルの内容を展開して引数リストに挿入します。

引数ファイルには、**jar**コマンドのオプションと引数(引数ファイルをサポートしない起動ツールに渡される**-J**オプションを除く)を含めることができます。ファイル内の引数は、空白または改行文字で区切ることができます。引数ファイル内のファイル名は、**jar**コマンドを実行できる現在のディレクトリに対して相対的であり、引数ファイルの場所に対しては相対的ではありません。通常はオペレーティング・システム・シェルによって展開されるアスタリスク(\*)などのワイルドカードは展開されません。

次の例は、**find**コマンドによる現在のディレクトリ出力からのファイル名で**classes.list**ファイルを作成する方法を示します。

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


 
```

**jar**コマンドを実行し、*@arg-file*構文を使用して**classes.list**ファイルを渡すことができます。

```
jar cf my.jar @classes.list


 
```

引数ファイルはパスを指定できますが、相対パスが記述された引数ファイル内のすべてのファイル名は、渡されたパスに対して相対的ではなく、**jar**コマンドの現在の作業ディレクトリに相対的となります。たとえば、次のようになります。

```
jar @dir/classes.list


 
```

# 注意

**e**、**f**および**m**オプションは、*entrypoint*、*jarfile*および*manifest*オペランドと同じ順序でコマンド行に出現する必要があります。

```
jar cmef myManifestFile MyMainClass myFile.jar *.class


 
```

# 例

**例 1** 冗長な出力による現在のディレクトリからのすべてのファイルの追加

```
% 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%)


 
```

**例 2** サブディレクトリからのファイルの追加

```
% 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/


 
```

**例 3** 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


 
```

**例 4** 索引の追加

株式取引のアプリケーションの相互依存クラスを、**main.jar**、**buy.jar**および**sell.jar**の3つのJARファイルに分割する場合、**i**オプションを使用します。**main.jar**マニフェスト内の**Class-Path**属性を指定する場合、**i**オプションを使用して、アプリケーションのクラス・ロードの速度を向上できます。

```
Class-Path: buy.jar sell.jar
jar i main.jar


 
```

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

アプリケーションのクラス・ローダーは、このファイルに格納されている情報を使用して、効率的にクラスをロードします。ディレクトリをコピーするには、最初に**dir1**内のファイルを**stdout**に圧縮してから、**stdin**から**dir2**にパイプラインを作成して抽出します(**-f**オプションは両方の**jar**コマンドで省略します)。

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


 
```

# 関連項目

•[pack200(1)](/man/os/openjdk-8/pack200.1).

•http://docs.oracle.com/javase/tutorial/deployment/jar/index.htmlにある JavaチュートリアルのJARに関する項

2013年11月21日 JDK 8

---

Document: jar(1) from openjdk-8 8.504-r3 (Chainguard OS)
Source: https://github.com/openjdk/jdk8u.git
