JAR

JAR (Java Archive)ファイルとは、JavaのクラスファイルやリソースがZIP形式で圧縮されたファイルです。この記事では、JARファイルとjarコマンドの使い方をご紹介します。

JARとは

JARとは、Javaのバイトコードやそれらが使用するリソースがZIP形式で圧縮されたファイル、及びそのツールである。ファイルの拡張子には.jarが使われる。

JARファイルはZIPファイルとほぼ同じであるが、ディレクトリ内にマニフェストと呼ばれるメタ情報が格納されている。 このメタ情報はJARファイルを扱うJavaのツールが解釈する。マニフェストは「META-INF/MANIFEST.MF」というファイル名前である。

実行

Javaプログラムは、クラスファイル(.class)だけでなく、JARファイル(.jar)を実行することもできる。JARファイルを実行するには、javaコマンドに -jar オプションを指定する。

$ java -jar example.jar

JARファイルを実行するためには、JARアーカイブ内のマニフェストファイル(MANIFEST.MF)にMain-Class属性が定義されている必要がある。Main-Class属性が定義されていないJARファイルを実行しようとすると、エラーが発生する。

$ java -jar example.jar
no main manifest attribute, in example.jar

作成

アーカイブを新規作成する。

jar c[vfmOMi] [jar] [manifest] [-C dir] file ...

作成するアーカイブのファイル名を指定するには、jar コマンドに f オプションを指定する。

$ jar cf example.jar Example.class example.properties

jar コマンドに v オプションを指定すると、アーカイブに追加するファイルの詳細情報が出力される。

$ jar cvf example.jar Example.class example.properties
added manifest
adding: Example.class(in = 466) (out= 325)(deflated 30%)
adding: example.properties(in = 4) (out= 6)(deflated -50%)

中身の確認

アーカイブの中身を確認するには、jar コマンドに t オプションを指定して実行する。デフォルトでは、標準入力からアーカイブを取得して中身を確認する。

$ cat example.jar | jar t
META-INF/
META-INF/MANIFEST.MF
Example.class

アーカイブの中身を確認するファイルを指定するには、jar コマンドに f オプションを指定する。

$ jar tf example.jar
META-INF/
META-INF/MANIFEST.MF
Example.class

アーカイブの中身を詳細に確認するには、jar コマンドに v オプションを指定する。

$ jar tvf example.jar
     0 Fri Mar 11 10:38:26 JST 2022 META-INF/
    55 Fri Mar 11 10:38:26 JST 2022 META-INF/MANIFEST.MF
   466 Sat Mar 05 12:21:48 JST 2022 Example.class

解凍(展開)

指定の(またはすべての)ファイルをアーカイブから解凍(展開)する。

jar x[vfmOMi] [jar] [manifest] [-C dir] file ...

アーカイブを解凍(展開)するには、jar コマンドに x オプションを指定して実行する。デフォルトでは、標準入力からアーカイブを取得して解凍(展開)する。

$ cat example.jar | jar x

解凍(展開)するアーカイブファイルを指定するには、jar コマンドに f オプションを指定する。

$ jar xf example.jar

jar コマンドに v オプションを指定すると、解凍(展開)するファイルの詳細情報が出力される。

$ jar xvf example.jar
  created: META-INF/
 inflated: META-INF/MANIFEST.MF
 inflated: Example.class

更新

既存アーカイブを更新する。

jar u[vfmOMi] [jar] [manifest] [-C dir] file ...
v
標準出力に詳細を出力する。
f
アーカイブファイルを指定する。
m
manifestで指定したファイルからマニフェスト情報を取り込む。
jar
JARのファイル名を指定する。
manifest
マニフェストファイルを指定する。mオプションと共に指定する。
file
JARに追加又は更新するファイルを指定する。空白で区切って複数指定できる。

example.jarにfoo/bar/baz.jpgが含まれていなければ追加する。example.jarにfoo/bar/baz.jpgが既に含まれていれば、example.jar内のfoo/bar/baz.jpgを置き換える。

$ jar uf example.jar foo/bar/baz.jpg

MANIFEST.MF

マニフェストファイル(MANIFEST.MF)の内容には、次に示す情報が格納されている。

Manifest-Version: 1.0
Created-By: 11.0.11 (Ubuntu)
Manifest-Version
マニフェストファイルのバージョン
Created-By
マニフェストファイルが生成されるJava実装のバージョンおよびベンダー
Signature-Version
jarファイルの署名のバージョン
Class-Path
アプリケーションまたは拡張機能に必要な拡張機能またはライブラリの相対URL
Main-Class
起動時に起動ツールによってロードされるメインアプリケーションのクラスの相対パス

JARとWARの違い

JARに類似する圧縮ファイルとして、ウェブアプリケーションをまとめたWAR (Web Application Archive)やEJBアプリケーションをまとめたEAR (Enterprise Archive)がある。

参考文献

Oracle (2017) JARファイルの仕様