jarでファイルをまとめる


Javaでプログラムを組むと、多くのclassファイルができます。
このため、Javaで作ったプログラムを配布などが面倒になります。
そこでJavaではjarを使ってclassファイルなどをまとめて扱うことができます。
圧縮展開
    jarコマンドを使って、いくつかのファイルをまとめて圧縮することができます。
圧縮
    jarコマンドでファイルをまとめて圧縮するときには次のようにします。
    jar cf JARファイル名 圧縮するファイル
    

    例えば、Sample3_1ではSample3_1.classとSample3_1$1.classというファイルが生成されて、実行にはこの2つのファイルが必要でした。この2つのファイルをまとめるためのコマンドは
    jar cf Sample3_1.jar Sample3_1.class Sample3_1$1.class
    となります。
    また、たとえばSample13_4では5つのclassファイルが生成されました。これらのクラスファイルをすべていちいち指定するのは面倒です。圧縮するファイルの指定には*や?などのワイルドカード文字が使えます。ワイルドカード文字を使ってSample13_4に必要なclassファイルをまとめるコマンドは

    C:\java>jar cf Sample13_4.jar Sample13_4*.class
    のようになります。
解凍
    jarで圧縮したJARファイルを解凍するときは次のようにします。
    jar xf JARファイル
    

    先ほど例に出したSample13_4.jarを解凍してファイルを取り出すには
    C:\java>jar xf Sample13_4.jar

    とします。
    ここで、解凍したときにMETA-INFというフォルダが作成されています。また、このフォルダにはMANIFEST.MFというファイルが作成されています。MANIFEST.MFには圧縮に使ったjarコマンドのバージョンなどが記述されています。
    Manifest-Version: 1.0
    Created-By: 1.3.0_02 (Sun Microsystems Inc.) 
    

    このフォルダをJARファイルに含めたくないときには、圧縮時にMオプションをつけて
    jar cfM JARファイル名 圧縮するファイル
    

    とします。
実行可能なJARファイル
    jarでまとめたclassファイルを、展開せずそのまま実行することができます。このようにしてclassファイルをまとめると、Javaで作ったプログラムを配布するのに便利です。
マニフェストファイル
    実行可能なJARファイルを作成するには、実行するクラスを記述したマニフェストファイルを作成する必要があります。
    マニュフェストファイルは以下のように記述します。
    Manifest-Version: 1.0
    Main-Class: メインクラス
    

    セミコロン「:」の後のスペースも省略できません。
    Sample13_4の場合では以下のようなファイルになります。ファイル名はなんでもかまわないのですが、ここではSample13_4.mfというファイル名にします。
    Manifest-Version: 1.0
    Main-Class: Sample13_4
    

圧縮
    実行可能なJARファイルを作成するときには、jarコマンドにmオプションをつけてマニュフェストファイルを指定します。
    jar cfm JARファイル マニフェストファイル 圧縮するファイル
    

    たとえば、Sample13_4で実行可能なJARファイルを作成するコマンドは

    C:\java>jar cfm Sample13_4.jar Sample13_4.mf Sample13_4*.class
    となります。
    オプションをcmfと指定したときには
    jar cmf マニフェストファイル JARファイル 圧縮するファイル
    

    のような順番になります。
実行
    JARファイルの実行はjavaコマンドに-jarオプションを指定します。
    java -jar JARファイル
    

    Sample13_4.jarを実行するコマンドは

    C:\java>java -jar Sample13_4.jar
    となります。

    Windows98やWindows2000などでJREやNetscape6がインストールされている場合は、JARファイルをダブルクリックしただけで起動できることもあります。
クラスパスの設定が必要なJARファイルの実行
    正規表現やJavaMailなど標準ではないライブラリを利用するときには、環境変数CLASSPATHを設定したり、javaコマンドに-classpathや-cpなどのオプションを指定して、そのライブラリを読みこむように指示する必要があります。
    しかし、JARファイルを実行するときには環境変数CLASSPATHやjavaコマンドのオプションは無視されてしまいます。
    これを回避する方法はいくつかありますが、どの方法もそれぞれ問題があります。

    マニフェストファイルに記述する
    マニュフェストファイルにクラスパスを相対パスで記述することができます。
    Manifest-Version: 1.0
    Main-Class: メインクラス
    Class-Path: 相対クラスパス
    ただし、一般に配布するときのように、どこにJARファイルが置かれるか分からないときやどこにライブラリがインストールされているか分からないときには使えません。

    javacコマンドでクラスパスとしてJARファイルを指定する
    JARファイルを実行するときに
    java -cp %CLASSPATH%;JARファイル JARファイル内の実行クラス
    
    または
    java -classpath %CLASSPATH%;JARファイル JARファイル内の実行クラス
    
    のように、実行するJARファイルをクラスパスに含めてしまいます。
    このようにして実行するときには、JARファイルを作成するときにマニフェストファイルを指定する必要はありません。
    Sample13_4.jarを実行するときには
    C:\java>java -cp %CLASSPATH%;Sample13_4.jar Sample13_4 
    この方法では、JARファイルがダブルクリックで起動できる環境でもDOSプロンプトのコマンドラインから実行する必要があることや、JARファイル内の実行クラス名がわかっている必要があります。コマンドの指定もわずらわしくなります。

    ライブラリをlib/extディレクトリに置く
    ライブラリのJARファイルをlib/extディレクトリに置くと、javaコマンドやjavacコマンド実行時にクラスの検索対象になります。そのため、必要なライブラリのファイルをlib/extディレクトリに置いておけば実行可能なJARファイルも問題なく実行することができます。
    また、この場合は通常のclassファイルの実行やjavacでのコンパイルでも環境変数CLASSPATHを設定する必要がありません。
    しかし、Windows環境では、lib/extディレクトリが複数の場所にあることがあり、javacコマンドとjavaコマンド、そしてjarファイルをダブルクリックしたときとで、検索するlib/extディレクトリが違うことがあります。
    これらのlib/extすべてにライブラリファイルを置く必要があります。
    検索するlib/extディレクトリは、JBuilderなどインストールしたツールによっても変わることがあります。

    ライブラリもJARファイルに含める
    JARファイルを作成するときにライブラリも含めてしまえば、クラスパスの問題は解消します。
    ただし、ライブラリをJARで圧縮された状態のままJARファイルに含めても使うことはできません。いったん解凍してからJARファイルに含める必要があります。
    この方法をとると、通常の実行可能なJARファイルと同様に扱うことができます。また、配布先のコンピュータにライブラリがインストールされている必要がなく、インストールされているライブラリのバージョンが必要なバージョンと違うなどの問題も回避できます。しかしライブラリのサイズが大きいときには向きません。また、ライブラリのライセンスがこのような配布方法を認めていないこともあります。

Copyright (c) 2001 Naoki Kishida All Rights Reserved.
http://www.fk.urban.ne.jp/home/kishida/