jar (Java Archive) は tar コマンドのようにファイルをアーカイブする JAVA のコマンドです。簡単に使用方法をまとめます。jar コマンドを利用するためには Oracle のページから JDK をダウンロードおよびインストールして PATH を通しておく必要があります。
sample/HelloWorld.java
package sample;
class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
コンパイルしておきます。
$ javac sample/HelloWorld.java
ディレクトリ構成は以下の通りです。
.
└── sample
├── HelloWorld.class
└── HelloWorld.java
実行例
$ java sample.HelloWorld
Hello World!
エントリーポイントとなる class ファイルを指定すれば実行可能な jar が生成できます。jar 生成時にマニフェスト情報が記載されたファイルを引数で指定することで情報を取り込めます。ファイル名は何でもよいですが、例えば Manifest.txt としてみます。
.
├── Manifest.txt
└── sample
├── HelloWorld.class
└── HelloWorld.java
Manifest.txt
Main-Class: sample.HelloWorld
以下のコマンドで jar を生成します。
$ jar cvfm sample.jar Manifest.txt sample
オプションの意味は以下の通りです。
-c jar を新規作成する
-v 標準出力に詳細な出力を生成する
-f jar ファイル名を指定する
-m 指定のマニフェスト・ファイルからマニフェスト情報を取り込む
成果物 jar を実行してみます。
$ java -jar sample.jar
Hello World!
「-t アーカイブの内容を一覧表示する」を利用します。
$ jar tf sample.jar
META-INF/
META-INF/MANIFEST.MF
sample/
sample/HelloWorld.class
sample/HelloWorld.java
「-x ファイルをアーカイブから抽出する」を利用します。
$ jar xvf sample.jar
以下のように展開されます。
.
├── META-INF
│ └── MANIFEST.MF
├── sample
│ ├── HelloWorld.class
│ └── HelloWorld.java
└── sample.jar
先程取り込んだマニフェスト情報が追加されています。
$ cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.7.0_75 (Oracle Corporation)
Main-Class: sample.HelloWorld
マニフェスト情報を取り込むためのファイルを指定しなければよいです。
$ jar cvf sample.jar sample
$ java -jar sample.jar
sample.jarにメイン・マニフェスト属性がありません
$ jar tf sample.jar
META-INF/
META-INF/MANIFEST.MF
sample/
sample/HelloWorld.class
sample/HelloWorld.java
そもそもマニフェストファイルを生成しないようにするためには M オプションを利用します。
$ jar cvfM sample.jar sample
$ jar tf sample.jar
sample/
sample/HelloWorld.class
sample/HelloWorld.java
「-u 既存アーカイブを更新する」オプションを利用します。
$ jar uvf sample.jar Append.class
$ jar tf sample.jar
sample/
sample/HelloWorld.class
sample/HelloWorld.java
Append.class
「-C 指定のディレクトリに変更し、以下のファイルを取り込む」オプションを利用することでカレントディレクトリを変更できます。
.
└── sample
├── HelloWorld.class
└── HelloWorld.java
ルートに HelloWorld.class などが直接配置されています。
$ jar cvf sample.jar -C sample .
$ jar tf sample.jar
META-INF/
META-INF/MANIFEST.MF
HelloWorld.class
HelloWorld.java
比較のために -C を利用しない場合の例を示します。
$ jar cvf sample.jar sample
$ jar tf sample.jar
META-INF/
META-INF/MANIFEST.MF
sample/
sample/HelloWorld.class
sample/HelloWorld.java