JARファイル

Revised: Sep./9th/2002: Since: Jan./1st/2002

JAR ファイル

Java では一般に、パッケージは JAR (JavaARchive) という圧縮ファイルで用意します。JAR は ZIP フォーマットの圧縮形式であり、パッケージを jar コマンドで圧縮することで作成します。同じく jar コマンドで解凍することもできます。実行環境に含まれるコア・パッケージも JAR ファイルとして配布されており、多くのベンダーから、クラス・ライブラリが JAR ファイルとして配布されています。

JAR ファイルの解凍

JAR ファイル pack.jar を解凍するには、次のコマンドを発行します。

>jar xvf pack.jar

JAR ファイルへの圧縮

ディレクトリ pack を pack.jar に圧縮するためには、次のコマンドを発行します。

>jar cvf pack.jar pack

JAR ファイルの閲覧

JAR ファイル pack.jar に圧縮されているファイルの一覧は、次のコマンドを発行することで取得できます。

>jar tf pack.jar

そのほかの jar コマンド

JAR コマンドの使い方は、フラグを付けない jar コマンドを発行することで閲覧できます。

>jar
使い方: jar {ctxu}[vfm0Mi] [jar-file] [manifest-file] [-C dir] files ...
オプション:
    -c  アーカイブを新規作成する
    -t  アーカイブの内容を一覧表示する
    -x  指定の (またはすべての) ファイルをアーカイブから抽出する
    -u  既存アーカイブを更新する
    -v  標準出力に詳細な出力を生成する
    -f  アーカイブファイル名を指定する
    -m  指定のマニフェストファイルからマニフェスト情報を取り込む
    -0  格納のみ。ZIP 圧縮を使用しない
    -M  エントリのマニフェストファイルを作成しない
    -i  指定の jar ファイルのインデックス情報を生成する
    -C  指定のディレクトリに変更し、以下のファイルを取り込む
ファイルがディレクトリの場合は再帰的に処理されます。
マニフェストファイル名とアーカイブファイル名は、フラグ 'm' と 'f'
の指定と同じ順番で指定しなければなりません。
例 1: 2 つのクラスファイルをアーカイブ classes.jar に保存する:
       jar cvf classes.jar Foo.class Bar.class
例 2: 既存のマニフェストファイル 'mymanifest' を使用し、foo/ ディレクトリ
           の全ファイルを 'classes.jar' にアーカイブする:
       jar cvfm classes.jar mymanifest -C foo/ .

JAR ファイル作成手順

ここでは、パッケージを作って、JAR ファイルを作成する手順をなぞって見ましょう。

パッケージのサンプル

PackageDemo.java:

import mytools.calc.Circle;
class PackageDemo {
	public static void main(String[] args) {
		Circle obj = new Circle();
		obj.setRadius(args[0]);
		obj.getResult();
	}
}

PacakgeDemo.classが存在するディレクトリからの相対パス./mytools/calcに次のクラスを作成します。

Circle.java

package mytools.calc;
public class Circle {
	private double radius;
	public void setRadius(String str) {
		radius = Double.parseDouble(str);
	}
	public void getResult() {
		double circum = 0, area = 0;
		circum = 2.0 * Math.PI * radius;
		area   = Math.PI * radius * radius;
		System.out.println("円周:" + circum);
		System.out.println("面積:" + area);
	}
}

コンパイル/実行結果

>javac PackageDemo.java

>java PackageDemo 1
円周:6.283185307179586
面積:3.141592653589793

>java PackageDemo 0.5
円周:3.141592653589793
面積:0.7853981633974483

CLASSPATH

クラスをサーチするパスを設定できます。これはネイティブの環境変数として設定します。

Windows9x系(Windows95/98/98SE/Me)の場合は、autoexec.batの末尾に記述します。例えば、C:\java\packagesをクラスのサーチパスに含めるには、次のエントリーを追加します。反映させるには再起動が必要です。

CLASSPATH .;C:\java\packages;%CLASSPATH%

PATH 変数のエントリーの次の行にでも追加すればよいでしょう。これで、C:\java\packageがサーチパスに追加されました。

WindowsNT系(WindowsNT4/2000/XP)の場合は、「コントロール パネル」の「システム」の「詳細」タブの「環境変数」で設定します。「システム環境変数」の「新規」ボタンで変数名をCLASSPATHにし、変数値に.;C:\java\packages;%CLASSPATH%をセットします。

UNIX/Linux系も通常の環境変数のセット方法と同じです。設計時に、システム全体で使うのか、特定のユーザだけで使うのかを考えて設定します。

試しに、先に作ったC:\java\mytoolsをこのディレクトリに移動してください。C:\java\packages\mytoolsになります。PackageDemoを実行すると、先ほどと同じようにCircleクラスがサーチされ実行されます。

コンパイル/実行結果

>javac packageDemo.java

>java PackageDemo 0.5
円周:3.141592653589793
面積:0.7853981633974483

jarファイル

通常は、一つのパッケージには複数のクラスを含めます。classファイルはバイナリ・ファイルであり、一般にサイズが大きくなるので圧縮して用意します。一つの圧縮ファイルとして提供することで、別の環境に移植するのが楽になります。Javaの圧縮ファイルはJAR (Java ARchive)と呼ばれ、圧縮スキームはZIPファイル・フォーマットに準じます。J2SDKにはJARファイル作成用のユーティリティ・ツールであるjarが同梱されています。使い方はUNIX系のtarコマンドと同じで、フラグはv,f,c,t,xなどが使えます。フラグなしでjarだけコマンドとして発行するとヘルプが見られます。

先に作ったmytools.calcパッケージをJARファイルにしてみましょう。mytoolsディレクトリが存在するディレクトリにカレントを移動して次のコマンドを発行します。

>jar cvf myjar.jar mytools
マニフェストが追加されました。
mytools/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
mytools/calc/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
mytools/calc/Circle.java を追加中です。(入 = 387) (出 = 231)(40% 収縮されました)
mytools/calc/myjar.jar を追加中です。(入 = 1000) (出 = 808)(19% 収縮されました)
mytools/calc/Circle.class を追加中です。(入 = 868) (出 = 542)(37% 収縮されました
)
>dir /B
mytools
myjar.jar

カレント・ディレクトリにmyjar.jarが作られていることが確認できます。これをCLASSPATHにセットすることができます。動作確認のために、mytoolsディレクトリを削除して、環境変数にmyjar.jarの絶対パスをセットしてください。Windows9x系の場合は、次のようになります。

CLASSPATH .;C:\java\packages;C:\java\packages\myjar.jar;%CLASSPATH%

不要になったC:\java\packagesは削除して、PackageDemoを実行して動作確認します。

>java PackageDemo 1
円周:6.283185307179586
面積:3.141592653589793

>java PackageDemo 0.5
円周:3.141592653589793
面積:0.7853981633974483

クラスファイルは削除されても、JARファイルにクラスパスが通っているために、正しく実行されることが確認できました。

JAR, WAR, EAR

サーブレットや JSP の実行環境であるアプリケーションサーバの場合、WAR (Web ARchive) という単位でアプリケーションを配布/配備(適用)します。代表的なアプリケーションサーバ環境が、 Apache Tomcat, Jetty です。アプリケーション・サーバを包括する J2EE コンテナの場合、EAR (Enterprise ARchive) という単位で配布/配備します。代表的な J2EE コンテナ環境が、IBM WebSphere Application Server, BEA WebLogic, JBoss, Apache Geronimo です。

EAR、WAR、JAR は何れも Java 仕様に準拠して定義された ZIP 圧縮ファイルです。JAR の場合は、ここで説明したとおり、そのままクラスパスの宛先として指定できます。EARは、複数の WAR や EJB JAR を含んだ ZIP 圧縮ファイルで、 J2EE コンテナに配布すると、J2EE コンテナが解凍して実行ディレクトリにコピーします。これを配備(デプロイ)と呼んでいます。

WAR には web.xmlが、EAR には application.xml が各々含まれており、配備方法やコンテナへの定義情報が記述されています。これらの XML ファイルは配備記述子 (DD: Deployment Descriptor) と呼ばれ、J2EE 仕様で DTD が定義されたものの他、J2EE コンテナ独自のものも存在します。

何れにせよ、WAR, EAR のディレクトリ構造は、J2EE 仕様で明確に決められています (J2EE 1.4仕様 8.4 Deployment)。*.ear には、一つの META-INF/application.xml と、複数の *.war*.jar が含まれています。*.war には、WEB-INF/web.xmlWEB-INF/classes/*.classWEB-INF/lib/*.jar*.jsp*.html などが存在します。

*.ear
  |
  +--META-INF
  |    |
  |    +--application.xml
  |
  +--*.war
  |    |
  |    +--WEB-INF
  |    |    |
  |    |    +--web.xml
  |    |    |
  |    |    +--classes
  |    |    |    |
  |    |    |    +--myPackage
  |    |    |    |    |
  |    |    |    |    +--*.class
  |    |    |    +--resources
  |    |    |    |    |
  |    |    |    :    +--*.properties
  |    |    |
  |    |    +--lib
  |    |         |
  |    |         +--*.jar
  |    |              |
  |    |              +--META-INF
  |    |              |    |
  |    |              |    +--MANIFEST.MF
  |    |              |
  |    |              +--myPackage
  |    |                   |
  |    |                   +--*.class
  |    |                   :
  |    |    
  |    +--*.jsp
  |    |
  |    +--*.html, *.png,...
  |
  +--ejb*.jar
  |
  :
図:極大雑把なディレクトリ構成
 Web Application Directory Structure
Sun Micorosystems: WARファイルの構造
J2EE Packages
Sun Microsystems: EARファイルの構造


Copyright © 2002-2005 SUGAI, Manabu. All Rights Reserved.
SEO [PR] !uO z[y[WJ Cu