twilight1730の資料室(wiki別館)

Java雑記003(jarアーカイブを作ってみる)

最終更新:

twilight1730

- view
管理者のみ編集可

目次


はじめに


 実行可能なjarアーカイブを作ろうとして色々失敗してたので、簡単なところから実行可能なjarファイルを作成できるまで頑張ってみました。


HelloWorldプログラムをjarアーカイブにまとめてみる


HelloWorld.classをjarアーカイブにまとめる


 一つのファイルをまとめるというと響きがおかしいですが、たくさんファイルが増えると混乱してしまうので、とりあえず単一のクラスファイルから練習してみます。

C:\Java\zakki03>jar cvf HelloWorld.jar HelloWorld.class
マニフェストが追加されました
HelloWorld.classを追加中です(入=414)(出=287)(30%圧縮されました)

 完了すれば、フォルダ内にHelloWorld.jarファイルが作成されていると思います。

2.HelloWorld.jar内のHelloWorldを実行


実行するにはjavaコマンドにオプションを渡して次のように実行します。

C:\Java\zakki03>java -cp HelloWorld.jar HelloWorld
Hello,World!

 このコマンドによりjavaインタプリタはカレントディレクトリではなくjarアーカイブ内からクラスファイルを捜索するようになります。-cpはJava1.2から追加されたオプションで、-classpathと同じです。-cpの後に捜索するアーカイブを指定してやります。尚、jarアーカイブは実際にはzipと圧縮規則は同じため、次のような実行も可能です。適当な方法でHelloWorld.zipを作成して

C:\Java\zakki03>java -cp HelloWorld.zip HelloWorld
Hello,World!


3.jarアーカイブの中身を見る


中身を見るには次のコマンドを実行してください。

C:\Java\zakki03>jar tf HelloWorld.jar
META-INF/
META-INF/MANIFEST.MF
HelloWorld.class

 新しくMETA-INFというフォルダが作成されMANIFEST.MFというファイルが作成されていると思います。これはマニフェストファイルといってjarアーカイブを作成したときに自動的に作成されます。中にはjarアーカイブを作る際の詳細情報などが入っています。このマニフェストファイルには自分で書いたマニフェストを含めることが出来、実行するmainメソッドを持つクラスはどこであるかといった情報を含めることが出来ます。そこで、マニフェストファイルを自分で追加してみます。


2.実行可能なjarアーカイブを作成(マニフェスト追加)


 まず、次のようなマニフェストファイルを作ります。名前は何でもよいです。

  • manifest.mani
Main-Class: HelloWorld
 

 これだけの記述ですが「mainメソッドを持つMain-ClassはHelloWorldクラスだよ!」と教えていることになります。ただし作成する際は次のことに注意してください。

  • "Main-Class:"の後は必ず半角スペースを入れること
  • 有効な行は必ず改行で終わりにしてください

 そうしたら、HelloWorld.jarに追加してやります。

C:\Java\zakki03>jar uvfm HelloWorld.jar manifest.mani
マニフェストが更新されました

 尚uオプションで追加を行いましたが、最初からユーザー定義のマニフェストを追加した上でjarアーカイブを新規作成する場合は次のコマンドを使用します。

C:\Java\zakki03>jar cvfm HelloWorld.jar manifest.mani
マニフェストが更新されました

 実行するには次のコマンドを実行します。

C:\Java\zakki03>java -jar HelloWorld.jar
Hello,World

 先ほどと大きく違うのはHelloWorldクラスを指定していないところです。マニフェストファイルにmainメソッドのあるクラスが表記されていることを期待しそちらを実行します。マニフェストファイルに正しくMain-Classが記述されていないと次のようなエラーを吐き出します。

C:\Java\zakki03>java -far HelloWorld.jar
Exception in thread "main" java.lang.NullPointerException
          at sun.launcher.LauncherHelper.getMainClassFormJar(Unknown Source)
          at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

"mainメソッドないよ!(参照先がnullポインタだよ!)"と言われます。

正しく指定されているjarアーカイブは、windows上であればダブルクリックで実行可能です。ただしその際に実行されるのはjavawコマンドで、実際にコンソール画面が開いて表示されることがなく、何が行われているかHelloWorldプログラムでは分かりません。AWTやSwingを使ったGUIプログラムなどで効果を発揮するでしょう(コンソール画面はいらんのですよ。言葉の意味は分からんがとにかく強い自信だ!)
記事メニュー
ウィキ募集バナー