6-3:Jarファイルと jarコマンド


・ Javaのモジュール管理のルールは非常に明快ですが、 現実にファイルの数が増えてくると管理が面倒です。 クラスライブラリの「アーカイブ」に当たるものが利用できると便利でしょう。 現在の JDKでは、zipまたは Jar形式に圧縮されたファイルを、 現実のファイルシステムと 同様に取り扱うことができます。 その場合、圧縮されたファイルが存在するディレクトリをクラスパスに指定すること ができます。 アプリケーションやクラスライブラリの開発が完了したら、 それを配布したりユーザが実行したりする場合には Jar形式にまとめておくのが 便利です。 Jar(Java Archive)は JDK1.1から登場した新しいアーカイブ形式ですが、 zip同様、 階層ディレクトリの構造を含めて単独のファイルに保存でき、 ファイルの圧縮の機能も併せて提供します。
 Jarの新しい機能は、 「マニフェスト・ファイル(manifest file)」 と呼ばれるものをつけ加えることができる点です(省略も可)。 マニフェスト・ファイルには、 アーカイブに含まれる個々のファイルについての情報が記憶されます。 その中には暗号化された電子署名を含めることも可能です。 この仕組みのおかげで、 Jarファイルは不正な改変に対するチェックを実現しています。

・ JDKには Jar形式のアーカイブを取り扱う jarコマンドも提供されています。 アーカイブの作成、アーカイブの内部の情報取得などは、 この jarコマンドを通じて行うことができます。 ただし、jarはオプションの指定などに多少クセがあります。 これは UNIXの tarコマンドのスタイルをそのまま引き継いでいるせいでしょう。 慣れるまで少しまごつくので、 jarの主要なオプションとその意味を表にまとめておきます。

jarコマンドのオプション
オプションの文字意味
cアーカイブの生成
tアーカイブの内容の表示
xアーカイブからの復元
fアーカイブファイル名の指定
v作業の途中経過の表示
mマニュフェストファイル名の指定
Mマニュフェストファイルの省略
0圧縮を行わない

 fオプションの後に、取り扱う(新たに生成する)Jarファイルの名前を指定します。 オプションとJarファイル名の後に来る引数は、 アーカイブに保存する(もしくはアーカイブから復活させたい)ファイルもしくは ディレクトリ名と見なされます。 それらが省略されている場合には、カレントディレクトリをアーカイブ化 (もしくはアーカイブのすべての内容を復活)します。 ディレクトリの内部はその全てのサブディレクトリに対してリカーシブに処理されます。 Jarファイルの名前に特別な制限はなく、 識別子 .jarは付けても付けなくてもかまいません。 jarコマンドの典型的な使用例は次のようになります。


#カレントディレクトリのバイトコードをすべてアーカイブにまとめる
jar  cvf  classes.jar  *.class

#ディレクトリ dirname の内容をすべてアーカイブにまとめる
jar  cvf  dirname.jar  dirname

#アーカイブファイル appli.jar の内容を調べる
jar  tvf  appli.jar

#アーカイブファイル appli.jar の内容を復元する
jar  xvf  appli.jar

 0オプションを付けると圧縮は行われません。 GIFや JPEGの画像ファイルのように既に圧縮が施されて いるファイルを集めてまとめる時や、 Jar形式のファイルをさらに二重に Jarファイルにまとめるような場合に有効です。
 mオプションは既にあるマニフェストファイルの情報も取り込むことを指定します。 この場合には引数の順番は、マニフェスト・ファイル、Jarファイル、保存ファイル (ディレクトリ)の順になります。 mオプションで指定したファイルがそのままマニフェスト・ファイルに なるわけではなく、新たにアーカイブ化されるファイルに関する情報はさらに 追加されて新しいマニフェスト・ファイルとなります。
 Mオプションはマニフェスト・ファイルを生成しないようにする指定です。 このオプションを明示的に指定しない限り、jarコマンドはマニフェスト・ファイルを 自動的に生成します。 Jarファイルを展開すると、マニフェストファイルも一緒に展開され、 その内容を見ることができます。 META-INFという名前のディレクトリの中のMANIFEST.MF という名前です。

・ マニフェスト・ファイルの形式を簡単にまとめておきましょう。


Manifest-Version: 1.0

Name: image.gif
Digest-Algorithms: SHA MD5
SHA-Digest: ObzVzHu9npf1E++oFk6pxtJxwZE=
MD5-Digest: pVM4BI20OgPIYaefH+BJnQ==
               :
               :