OSGi フラグメントは、特有のマニフェスト・ヘッダーを持つ Java™ アーカイブ・ファイルであり、これらのヘッダーは、OSGi フラグメントを 1 つまたは複数の指定されたホスト・バンドルに付加して機能させることができます。
フラグメントは、ホスト・バンドルの一部として扱われます。フラグメントの関連定義は、
情報が矛盾しない限り、ホストが解決される前にホスト・バンドル定義
とマージされます。
フラグメントの依存関係は、可能であれば解決されます。フラグメントの依存関係が解決できない場合、フラグメントはホスト・バンドルには付加されません。フラグメントは、独自のクラス・ローダーおよびバンドル・アクティベーターを持つことはできません。フラグメントは、ホスト・バンドルにある情報を上書きすることはできません。フラグメントは、
リソース、クラス、および許可されたヘッダーでバンドルを拡張することにより、
バンドルのカスタマイズを可能にします。
OSGi フラグメント・マニフェスト・ファイル
OSGi フラグメント JAR ファイルには、フラグメント・マニフェスト・ファイルが含まれます。 このファイルには、OSGi フレームワークが 1 つまたは複数のホスト・バンドルにフラグメントを付加できるメタデータが含まれています。
以下のコードは、バンドル・マニフェスト・ファイル
META-INF/MANIFEST.MF のコンテンツの例です。
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Fragment
Bundle-SymbolicName: Fragment
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Fragment-Host: WebBundle;bundle-version=1.0.0.qualifier
Import-Package: org.apache.commons.logging;version="1.0.4"
Export-Package: com.sample.myservice.api;version="1.0.0"
このマニフェスト・ファイル内のメタデータには、以下のキー・プロパティーが含まれます。
- Fragment-Host
- フラグメントを潜在的なバンドル・ホストにリンクします。
- Bundle-Version
- フラグメントのバージョンを記述し、バンドルの複数のバージョンを同じフレームワーク・インスタンスで
同時にアクティブにできるようにします。
- Bundle-Name
- 人間が理解できるフラグメントの名前を提供します。
- Bundle-SymbolicName
- フレームワーク内のフラグメントを一意的に識別します。これを指定しても、Bundle-Name ヘッダーが必要であることに変わりはありません。
- Import-Package
- フラグメントの解決のために OSGi Framework で使用される、フラグメントの外部依存関係を宣言します。各パッケージの特定のバージョンまたはバージョン範囲を宣言できます。
この例のマニフェスト・ファイルでは、org.apache.commons.logging パッケージがバージョン 1.0.4 以降で必要とされます。
- このプロパティーを使用して、フラグメントがランタイムからインポートする、任意のパッケージの名前を指定します。
バンドルに必要なパッケージをこのプロパティーで指定しない場合、バンドルのロード時に NoClassDefFound 例外およびコンパイル・エラーを受け取る可能性があります。
注: パッケージを含むバンドルの Export-Package プロパティーにこのパッケージを指定する必要もあります。
制約事項: バンドル・マニフェスト・ファイルで Import-Package プロパティーを使用してワークスペースまたはターゲット・プラットフォーム内にないバンドルへのバンドル依存関係を宣言する場合、エディターはこの依存関係にエラーのマークを付けます。この制限を回避するには、依存関係として宣言するバンドルがすべて確実にワークスペースにあるようにするか、クイック・フィックスを使用してターゲット・プラットフォームにバンドルを追加します。クイック・フィックスを使用するには、「マーカー」ビューに切り替えてからエラー・マーカーを右クリックして「クイック・フィックス」を選択します。
重要: MANIFEST.MF ファイルでバンドル依存関係を指定するとき、プロパティー
Require-bundle ではなく
Import-Package を使用してください。
Require-bundle を使用してバンドル依存関係を指定すると、アプリケーションはデプロイされません。
依存関係を宣言するためのより柔軟な方法は、
Import-Package を使用することです。
- バンドルでは必要ではないがその従属バンドルに含まれている
パッケージに対する不必要な依存関係が追加されないため、機能の発生元であるバンドルにではなく、必要とする機能に
対して依存関係を宣言することができます。
- 宣言されたパッケージのバージョンまたはバージョン範囲を指定でき、
その結果、異なるバージョンのバンドルでの変更に対応する必要がありません。
- Export-Package
- フラグメント外部からも可視となるパッケージを宣言します。ここで宣言されないパッケージは、フラグメント内でのみ可視となります。
- このプロパティーを使用して、フラグメントがランタイムにエクスポートする、任意のパッケージの名前を指定します。
このプロパティーの他のバンドルに必要なパッケージを指定しない場合、従属バンドルが解決しない可能性があります。