[JAVA]jarファイルを作成して実行

投稿者:

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クラスを実行するように指定している。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください