目次 | |

11. パッケージ化

11.1 目標とすること及び目標としないこと

11.では,パッケージ化されたJava Beanが, ツール及びアプリケーションで使用できるために必要な, 形式及び規約を規定する。

Java Beans規定は,アプリケーションが使用するJava Beansを保存するために, アプリケーションが使用する形式を規定するものでは ない。 特に,アプリケーションビルダという特別だが非常に重要な場合に対して, Java Beans規定は,プロジェクトのための形式を規定しないし, 組み立てられたアプリケーションの配布のための形式も規定しない。 そこで,例えば,ビーンズは,最初はJARファイルとして配布されるが, アプリケーションに組み込まれるときには,任意に再パッケージ化してもよい。

11.2 JARファイルの概要

Java Beansは,JDK 1.1でサポートされた新しい技術であるJARファイルの形式で, パッケージ化し,配布する。 JARファイルは,クラスファイル,直列化されたオブジェクト,イメージ, ヘルプファイル及び同様の 資源 ファイルを収集するために使用する。

JARファイルは,ZIP形式のアーカイブファイルとする。 これは,JARファイルの内容を記述する付加的な情報をもった 明示ファイル(manifest file) (11.5参照)を,オプションで含んでもよい。 ビーンズを含むすべてのJARファイルは, それらビーンズを記載した目録をもたねばならない。 一つのJARファイルが,二つ以上のJava Beanを含んでいてもよい。 これによって,パッケージ化を単純化し, パッケージ化の時点でのクラス及び資源ファイルの共有を可能とする。

JARファイル内のクラスは,署名されているかもしれない。 これによって,クラスに付加的な特権が与えられることがある。 (クラスの署名は,明示ファイル内にも保存される情報を使用する。)

11.3 内容

Java Beans JARファイルは,一つ以上のパッケージ化された Java Beans を定義する多くのエントリを含む。 規約として,JARファイルエントリは,“a/b/c”などの, スラッシュで区切った名前で与えられる。

各Java Beans JARは,次の項目を定義するエントリを含んでもよい。

a) Java Beanに対して振舞いを提供するクラスファイルの集合。 これらのエントリは,末尾が“.class”となる名前をもたなければならない。 例えば,“foo/bah/Aardvark.class”など。
b) ビーンを初期化するために使用する直列化されたビーンの原型。 これは,オプションとする。 これらのエントリは,末尾が“.ser”となる名前をもたなければならない。 例えば,“foo/k.ser”など。
c) Java Beanに対して文書を提供するためのHTML形式のヘルプファイル。 これは,オプションとする。 Java Beanを現地化する場合は,この文書の複数の版が,ロケールごとに一つ, 存在するかもしれない。 これらのエントリは, 形式 <locale>/.../<tail>.html の名前をもたなければならない。
d) ビーン自体を現地化するために,ビーンが使用する国際化情報。 これは,オプションとする。
e) (イメージ,サウンド,ビデオなどの,) Java Beanが必要とする他の 資源 ファイル。 これは拡張可能とする。

11.4 Beansの名前

ビーンの名前は,“.”で区切られた複数の名前の列を含む文字列とする。

単に,クラスからインスタンス化したビーンズは, 対応するクラスと同じ名前をもつ。 これは,各“.”を“/”に置き換え,末尾に“.class”を付加することによって, JARエントリに写像する。 そこで,クラス“x.y.z”は,JARエントリ“x/y/z.class”から読み込まれる。

直列化された原型に基づくビーンズは,クラス名と同様の“.”で区切った名前ももつ。 これは,各“.”を“/”で置き換え,末尾に“.ser”を付加することによって, JARエントリに写像する。 そこで,直列化されたビーン“a.b.c”は, JARエントリ“a/b/c.ser”から読み込まれる。

クラス名と同様に,ビーンズ名は, 与えられたクラスローダ内で一意でなければならない。 命名の衝突を避けるために,ビーン開発者は, クラスに対する標準 Java デファクト命名規約に従うことが望ましい。 この規約では,最上位のパッケージ名は,会社名とする。

ビーンズを含むJARファイルは, JARアーカイブ内のどのエントリがビーンズを表現するかを示す, 明示ファイル(11.5参照)をもたなければならない。 “.class”で終わるエントリに対して, 対応するクラスがビーンとなることを,“.ser”で終わるエントリに対して, エントリが直列化されたビーンを保持することを,それぞれ示す。

11.5 明示ファイルの形式

JARアーカイブは,その内容を示す 明示ファイル(manifest file) を,JARファイル形式の一部として,含んでもよい。 (完全な規定に関しては,明示ファイル規定を参照すること。)

明示ファイルは,“META-INF/MANIFEST.MF”と命名しなければならない。

JARアーカイブ内の明示ファイルは, そのアーカイブの内容の選択した一部に関する情報を提供する。 それは,空行で分離された セクション(section) の順序列とする。 各セクションは,一つ以上の ヘッダ(header) を含む。 このヘッダは,(例えば,RFC822 規格に適合するので,)各々, <tag>:<value> の形式とする。 アーカイブ内のファイルに関する情報を提供する節は, <tag>を Name とし, <value>を,記述しているファイルの相対的な名前とする ヘッダをもたなければならない。

JDK 1.1 では,明示的なエントリ名は, スラッシュを使用しなければならない。 バックスラッシュを使用した場合は,正しく処理されない。

明示ファイルは, JARアーカイブ内のビーンが何かを示す情報を含むことができる。 JARアーカイブ内のファイルが Bean の場合, それに対応するセクションは, <name>を Java-Bean とし, <value>を True とする (大文字及び小文字は重要ではない)ヘッダを含まなければならない。

例えば,明示ファイルの二つの意味のあるセクションを,次に示す。

	Name: wessex/wonder/bean.class
	Java-Bean: True

	Name: wessex/quaint/bean.ser
	Java-Bean: True
	Depends-On: wessex/wonder/bean.class

JDK 1.1“jar”コマンドは,JARファイルを生成するために使用できる。 例えば,次のコマンドは,manifest.tmp から初期化するという明示をした, ファイル foo.class 及びファイル bah.class を含む JARファイル fred.jar を生成する。

	jar cfm fred.jar manifest.tmp foo.class bah.class

11.6 Java Beans で使用する明示ヘッダ

三つの明示ヘッダタグ,“Java-Bean”,“Depends-On”及び “Design-Time-Only”,を,Java Beans での使用のために定義する。

11.6.1 Java-Bean

ヘッダタグ“Java-Bean”は,Java Beans を表現する JAR エントリを識別するために使用する。

JARファイル内の各ビーンは, タグを“Java-Bean”及び値を“True”とする(大文字及び小文字の区別は, 重要ではない)ヘッダ行をもつ明示エントリによって,識別されなければならない。

そこで,例えば,次の例に示す明示ファイルは, 次の二つのビーンズを定義する。

次に例を示す。

	Name: wessex/bean.class
	Java-Bean: True

	Name: wessex/leaf.ser
	Java-Bean: True

11.6.2 Depends-On

JARエントリの明示セクションは,“Depends-On”タグを使用して, 依存する他のJARエントリを指定することができる。

“Depends-On”タグの後には, スペースで区切ったJARエントリの名前のリストが続くのがよい。 一つの与えられた“Depends-On”行で,ゼロ個以上の依存性を指定できる。 一つの与えられた明示セクションは, ゼロ個以上の“Depends-On”行を含むことができる。

JARエントリの明示セクションが“Depends-On”行を含まない場合は, その依存性は不明とする。

ビーンの明示セクションが一つ以上の“Depends-On”行を含む場合は, これらの行は,集まりとして, このビーンが依存するJARエントリの完全なリストを定義する。 リストが空の場合は,依存性は存在しない。

“Depends-On”をサポートするJARエントリは,その依存性のすべてを, 明示的に指定しなければならないことに注意すること。 依存する他のJARエントリからの,間接的な依存性を継承することはない。

例えば,次の例に示す明示ファイルは,次のビーンズを定義する。

次に例を示す。

	Name: a/b.ser
	Java-bean: True

	Name: x/y.class
	Java-Bean: True
	Depends-On: x/a.gif x/b.gif
	Depends-On: mammal/Wombat.class

	Name: TinyBean.class
	Java-Bean: True
	Depends-On:

この明示ファイルは,明示エントリをもたない,いくつかのJARエントリ (x/a.gif,x/b.gif 及び mammal.Wombat)も参照する。 これらは“Depends-On”行をもたないので,その依存性は不明となる。

11.6.3 Design-Time-Only

JARエントリに対する明示セクションは,与えられたエントリが, 設計時だけに必要かどうかを指定するために,“Design-Time-Only” タグを使用できる。 これによって,ビルダツールは, 構成されたアプリケーションの一部としてビーンをパッケージ化するときに, 与えられたエントリを排除する選択を行うことができる。

“Design-Time-Only”タグの後には, “True”又は“False”のどちらかの値が続くのがよい。

そこで,例えば,次の例の明示ファイルは, ビーン argle.Barble を定義し,JARエントリ argle/BargleBeanInfo.class は,設計時だけに必要なことを示す。

次に例を示す。

	Name: argle/Bargle.class
	Java-Bean: True

	Name: argle/BargleBeanInfo.class
	Design-Time-Only: True

状況によっては,“設計時”情報のあるものをそのまま渡したい場合もある。 例えば,ツールをビーンのカスタム化のためだけに使用する場合には, 元のビーンからの設計時情報のすべてを含む新しいビーンを出力してもよい。 同様に, ツールが実行時に可視的と操作可能とを分離することを望むビーンズを 生成している場合には, 元のビーンズからの設計時情報を含んでいてもよい。

11.7 資源ファイルのアクセス

Javaコードは,ファイルに保存した情報へのアクセスが必要になることがある。 例えば,直列化されたオブジェクトの他に,イメージ,オーディオファイル, テキストメッセージなどの情報である。

JDK 1.1は,クラスが実際に存在する場所 (例えば,ローカルディスク内又は http に基づく ClassLoader) に依存しない方法で,クラスが使用する 資源 を指定する, 基本的な機構を提供する。 Beans の永続的な表現(11.8参照)へのアクセスは, JDK 1.1で国際化機能を使用する場合と同様に,この基本機能を使用する。

典型的な使用例を,次に示す。

	Class c = Class.forName("foo.bah.XyzComponent");
	InputStream x = c.getResourceAsStream("/foo/bah/MyRedStuff.txt");
詳細に関しては,JDK 1.1 内の 資源 及び 国際化 を参照すること。

11.8 永続的な表現

JARファイルは,直列化されたJava Beansの原型を含んでよい。 Java Beansのすべてが,原型をもつ必要はない。 原型をもつビーンズは,Javaオブジェクト直列化機構を使用する(5.参照)。

原型は,単に,java.io.ObjectInputStream 及び java.io.ObjectOutputStream を使用することによって, 保存し復元する。そこで,直列化するためには,次のとおりにする。

	java.io.OutputStream out = ...// the stream where to serialize
	java.io.ObjectOutputStream s = new java.io.ObjectOutputStream(out);
	s.writeObject(myComponent);

非直列化は,多少複雑になる。 通常,特定のクラスローダのコンテキストで, 直列化したオブジェクトを非直列化したい。 そこで,まず,使用できるクラスを配置して,ソースのクラスローダを識別し, 次に,Beans.instantiateを使用して,そのクラスローダで, 名前の付いたビーンをインスタンス化しなければならない。

	ClassLoader cl = Class.forName("foo.bah.Xyz").getClassLoader();
	MyStuff x = (MyStuff) Beans.instantiate(cl,"/foo/bah/MyRedStuff.ser");

Beans.instantiate を使って, ストリームからオブジェクトを非直列化する場合には, .class ファイルがあらゆるクラス依存性を満足するために, ソースとして指定したクラスローダを使用する。

詳細に関しては,直列化及び Beans.instantiate に関する文書を参照すること。

11.9 ヘルプ文書

文書は,HTMLエントリの集まりとして記述する。 これらのエントリは,HTML 2.0 形式とすることが望ましい。 Java Beansを使用するアプリケーションは,ユーザに表示する前に, これらのエントリの内容を, 選択する書式へと翻訳することを選択するかもしれない。

各ビーンに対する,オプションの最上位のヘルプの文書は, <locale>/<bean-name>.html 内にできる。 (文書が,単一のロケールに対してだけ利用可能な場合は, 最初の <locale>/ は,省略してよい。)

他の情報への相互参照は,ハイパリンクとして表示できるが,これは, 同じJARファイル内の他のhtmlファイルへの相対的なURLとして, 又はベンダのウェブサイトへと指し戻す絶対的なURLとして, のいずれかとすることができる。



目次 | |