JAVAのjarファイルはディレクトリ構造ごとファイルをパッケージしたものだ。試しに手元にjarファイルがあったら拡張子のjarをzipに変えてみて欲しい。Windowsのエクスプローラ等で中身を見るとディレクトリ構造とclassファイルやその他のファイルが見えるはずだ。
JAVAでAndroidアプリを作る時、jarファイルを意識することはほとんどないが、WindowsでJAVAアプリを作る機会があったので、その時の経験をここに記しておこうと思う。
jarファイルの作成
jarファイルの作成にはjarコマンドを使う。
classesディレクトリの下にコンパイル済みのclassファイルがあるとして、それらを一つのjarファイル”myapp.jar”にまとめる場合、以下のようにする。
>jar cvf myapp.jar classes
cvfはjarコマンドのオプションで
c:ファイルを作成
v:処理内容を表示する
f:ファイル名を指定する
オプションに続いてjarファイル名、ディレクトリ名と続く。
実行可能ファイルを作りたい場合はマニフェストファイルMANIFEST.MFにmainメソッドを含むクラスを指定しておく。MANIFEST.MFはテキストファイルでファイル名は実は何でもいい。中には次のように書いておく。
Main-Class: myapp
“Main-Class:”の後にあるのがmainメソッドを含むクラス名だ。
それからjarコマンドでmオプションでマニフェストファイルを指定してjarファイルを作成する。
>jar cvfm myapp.jar MANIFEST.MF classes
これで実行可能jarができる。
jarファイルを実行
jarファイルを実行するときはjavaコマンドに”-jar”オプションを使用する。
>java -jar myapp.jar
マニフェストでMain-Classに指定したクラスのmainメソッドが実行される。マニフェストにMain-Classの記述が無いときは実行できない旨のメッセージが表示される。
プログラム内で外部ライブラリを使用している場合は、通常、”-cp”や”-CLASSPATH”オプションでクラスパス(CLASSPATH)を指定して実行するが、-jarオプションを使用すると-cpは無視されるようだ。
したがってmyapp.jarが外部のlib/exlib.jarを使用しているとき……
>java -cp lib/exlib.jar -jar myapp.jar
としてもエラーが発生する。-cpオプションが無効なのでライブラリを見つけられないからだ。
では、jarファイルのプログラムが外部ライブラリを使用している場合、クラスパスをどう指定すればいいのだろうか。
マニフェストにクラスパスを記述する方法もあるようだが、一番手っ取り早いのは、-cpオプションですべてのjarファイルをクラスパス指定(複数ある場合はセミコロン(;)で区切る)して、それらの中のmainメソッドを含むクラスを実行する。
>java -cp myapp.jar;lib/exlib.jar myapp
(UNIX系の環境ではクラスパスをコロン(:)で区切る。上はwindow環境での例)
上の例では-cpでmyapp.jarとlib/exlib.jarの二個のファイルをクラスパスに指定して、その中にあるmyappクラスを実行するように指定している。