実行可能な JAR ファイルの作成

[2005/03/29],[2009/01/30]追

Java プログラムをコンパイルすると .class ファイルがいくつかできます. これを jar コマンドでアーカイブにすると,クラスファイルをまとめて一度 に配布したりすることが可能ですが,さらに jar ファイルのままで実行可能 にすることも可能です.通常,アプレットでは制限のためファイルの入出力な どはできませんが,実行可能な jar だとアプリケーションとして実行される ため入出力も可能になります.

まず,何かを実行する Java プログラムがあるとしましょう.これを Foo.java とします.内容は「100x100 のウィンドウを開き,線を1本 描く」という単純なものです.
// <applet code="Foo.class" width=100 height=100></applet>

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class Foo extends Applet {
  public void init() {
    setBackground(Color.white);
  }

  public void paint(Graphics g) {
    g.drawLine(10,10,90,90);
  }

  public static void main(String args[]) {
    Applet applet=new Foo();

    applet.init();

    Frame f=new Frame();
    f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) {System.exit(0);}
    });
    f.add(applet);
    f.setSize(100+20,100+30);
    f.show();
  }
}
これを「javac Foo.java」としてコンパイルすると Foo.class と Foo$1.class ができます.

jar コマンドには通常 jar ファイル名に加え,クラスファイルなどのアーカ イブに含めたいファイル名を指定します.
jar cf Foo.jar *.class
これに加え,ここではさらに以下の内容のマニフェストファイル Foo.mf を用意し,このファイルもアーカイブに含めるよう指定します (ファイルの内容は jar アーカイブでのメインとなるクラス名(ここ では Foo)の指定です).
Main-Class: Foo
.mf ファイルを加えたアーカイブの作成指定は以下のように行ないます.
jar cfm Foo.jar Foo.mf *.class

この操作により作成されたアーカイブ内容を jar コマンドで表 示させると以下のようになります.
% jar tf Foo.jar
META-INF/
META-INF/MANIFEST.MF
Foo.class
Foo$1.class
META-INF/MANIFEST.MF というファイルが新たに加わっていますが,このファ イルの中に指定した Foo.mf ファイルでの「Mail-Class: Foo」の行 が以下のように取り込まれています(通常は始めの2行のみ).
Manifest-Version: 1.0
Created-By: 1.4.2_04 (Sun Microsystems Inc.)
Main-Class: Foo

以上の処理で作成した jar ファイル ( FooExec.jar) を Web ブラウザで開くと Windows の Mozilla であれば「デフォルトの アプリケーション (jarfile) で開く」と出てそのままアプリケーションとし て実行することが可能です.IE の場合は,このリンクを右クリックし て一度ファイルを保存し,そのファイルをダブルクリックす ることで実行可能です(ただし拡張子が.htmlや.zipとなる場合があるような ので,保存時にファイル種類を「すべてのファイル」としファイル名の後ろに .jar を付加して下さい).

jar ファイルは「java -jar Foo.jar」としても実行可能です(マニフェスト ファイルでメインクラスを指定していない場合は「java -jar Foo.jar Foo」 などと jar ファイル名の後にメインクラスを明示する).

蛇足ですが,上記のサンプルプログラム中での addWindowListener の指定が ないと Windows 上ではウィンドウを閉じる操作をしても実行中のアプリケー ションは終了しません.


リンク
上へ