例: OSGi アプリケーション・マニフェスト・ファイル

エンタープライズ・バンドル・アーカイブ (EBA) ファイル内の OSGi バンドルは、アプリケーション・マニフェスト・ファイル META-INF/APPLICATION.MFで宣言することにより、他の OSGi アプリケーションとサービスを共有します。 OSGi アプリケーションが生成するあらゆる外部 サービスおよび参照は、マニフェスト内にこれらを宣言することで公開され、 このアプリケーションが消費するあらゆる外部サービスおよび参照も、マニフェスト内に宣言されます。

アプリケーション・マニフェストは、アプリケーション・レベルのモジュール性を記述します。 アプリケーション・マニフェストでは例外別の構成を使用します。すなわち、デフォルトをオーバーライドしたい場合に限って値を指定します。 EBA ファイルは、アプリケーション・マニフェスト・ファイルを含んでいる必要はありません。 デフォルトでは、アプリケーション・マニフェストが宣言されていない場合、アプリケーション・コンテンツは OSGi アプリケーションに含まれる OSGi バンドルのセットになり、外部サービスまたは外部参照は生成もコンシュームもされません。

アプリケーション・マニフェストは、アプリケーションのプライマリー・コンテンツを形成するバンドルを指定します。 プライマリー・コンテンツにリストされているバンドルがアプリケーションに含まれていないパッケージを使用していて、そのために他のバンドルを引き入れる必要がある場合があります。 アプリケーション・マニフェストは、一部のバンドルについて、許容可能なバージョン範囲を指定する場合もあります。 この範囲は、アプリケーションの初期バージョンと、アップグレード可能な最新バージョンを定義します。

Eclipse ツールに、マニフェスト・ファイル用の便利なエディターがあります。

以下は、サンプルのアプリケーション・マニフェスト・ファイル META-INF/APPLICATION.MF です。
Manifest-Version: 1.0
Application-ManifestVersion: 1.0
Application-Name: My Club
Application-SymbolicName: com.myclub.app
Application-Version: 1.0
Application-Content: 
  com.myclub.api; version=1.0.0,
  com.myclub.persistence; version=1.0.0,
  com.myclub.web; version="[1.2.0,1.2.5)",
  com.myclub.common; version="(1.2.0,2.0.0)"
Application-ImportService: com.myclub.security.authenticationService; filter="(security=strong)"
Application-ExportService: com.myclub.memberService
Use-Bundle: com.clubs.utils; version="[1.0.0,1.1.0)"
アプリケーション・マニフェスト・ファイル内のメタデータには、以下のヘッダーが含まれます。
Manifest-Version
マニフェスト形式のバージョン番号。
Application-ManifestVersion
このマニフェストが準拠するアプリケーション・マニフェストのバージョン。
Application-Name
人が読むことのできるアプリケーションの名前。

この値を指定しない場合、デフォルト値は、アプリケーションのシンボル名になります。

Application-SymbolicName
アプリケーションを一意的に識別する名前です。 この名前は、OSGi バンドルの Bundle-SymbolicName ヘッダーと同じスキームに従います。 この値は、Application-Content ヘッダーにリストされている、アプリケーション内のバンドルまたは複合バンドルの Bundle-SymbolicName ヘッダーの値と同じであってはなりません。

この値を指定しない場合、デフォルト値は、EBA ファイルの名前になります。

Application-Version
アプリケーションのバージョンを一意的に識別するバージョン番号です。 アプリケーションのシンボル名とバージョンの組み合わせは、OSGi アプリケーション・ランタイム環境で固有でなければなりません。

値を指定しない場合でも、アプリケーション名に下線文字「_」とそれに続いて有効なバージョン値がある場合、この値が使用されます。 例えば、アプリケーション名が com.ibm.ws.eba.example_1.2.3.eba の場合、デフォルト値は 1.2.3 となります。

そうでない場合に値を指定しないと、デフォルト値は 0.0.0 になります。

Application-Content
アプリケーションのプライマリー・コンテンツを構成するアプリケーション・モジュールのリスト。 これらは、EBA ファイルに直接含まれるモジュールか、または、参照によって指定される バンドル (すなわち、アプリケーション用にプロビジョンするコア・バンドル) に することができます。

値を指定しない場合、デフォルトは、EBA ファイルのルートに直接含まれるモジュールになります。

書式は、コンマ区切りのモジュール宣言のリストで、各モジュール宣言では、以下の書式を使用します。
bundle_symbolic_name;version

バージョン書式は、OSGi インポート (例: Import-Package 構文の書式) に使用されているものと同じです。

Application-Content ヘッダーには、以下の属性があります。
バージョン
バージョン範囲に OSGi 構文を使用して指定されるモジュールのバージョン。 通常、アプリケーション作成時のモジュールのバージョン、 およびアプリケーションをアップグレード可能な最新のバージョンを指定します。

バージョン範囲の OSGi 構文で、大括弧 [ ] は 対応する下限または上限を含むことを意味し、小括弧 ( ) は対応する下限または上限を除外することを意味します。 例えば、[1.0.0,2.0.0) は、バージョン 1.0.0 以降最大で 2.0.0 までのすべてのバージョンだが、バージョン 2.0.0 を含まない ことを意味します。

Application-Content ヘッダーは、ビジネス・サービスを構成する重要なアプリケーションを定義しますが、アプリケーション内の全バンドル・リストを定義するわけではありません。 コンテンツにリストされているバンドルが、アプリケーションに含まれていないパッケージを使用する場合、アプリケーションのデプロイ時に依存関係が分析され、他のバンドルがプロビジョンされます。 プロビジョンされているバンドルは、アプリケーションの外部のサービスを提供できず、サービスに適用されるセキュリティーを設定することができません。 そのようなバンドルは、分離された各アプリケーションにプロビジョンされるのではなく、共有バンドル・スペースにプロビジョンされます。

重要: アプリケーションに Web アプリケーション・バンドル、EJB バンドル、またはパーシスタンス・バンドルが含まれている場合は、これらのバンドルを Application-Content ヘッダーにリストする 必要があります 。 これらのバンドルを Application-Content ヘッダーにリストしない場合、それらは共有バンドル・スペースにプロビジョンされます。バンドルは、引き続きパッケージを提供することは可能ですが、それらのコンテンツは Web、EJB、または JPA コンテナーで処理されないため、正常に機能しなくなります。
Application-ImportService
リモート可能 サービスには、アプリケーションの外部からアクセスできます。 このヘッダーには、サービス・インターフェース名のリストと、アプリケーションがアプリケーションの外部からコンシュームするリモート可能サービスを識別するオプションのフィルターが含まれています。

このヘッダーを指定しない場合、サービスはインポートされません。 値を指定しない場合には、値なしがデフォルトになります。

フォーマットは、サービス・インターフェース名の後に filter 属性を付けたサービスのコンマ区切りリストです。この属性は、OSGi サービス・フィルターを指定します。

以下に例を示します。
Application-ImportService: com.myclub.security.authenticationService; filter="(security=strong)"

リモート化可能サービスは、値による受け渡しのセマンティクスをサポートしていなければなりません。 Application-ImportService ヘッダーによってインポートされたサービスと突き合わせるには、サービス参照で service.imported プロパティーを検索する必要があります。これにより、ローカル呼び出しのみをサポートし、参照による受け渡しセマンティクスを予期するサービスの偶発的な公開または使用を防止します。

Application-ExportService
リモート可能 サービスには、アプリケーションの外部からアクセスできます。 このヘッダーには、アプリケーションが提供するリモート可能サービスを識別するサービス・インターフェース名のリストと、オプションのフィルターが含まれています。

このヘッダーを指定しない場合、サービスはエクスポートされません。 値を指定しない場合には、値なしがデフォルトになります。

フォーマットは、サービス・インターフェース名の後に filter 属性を付けたサービスのコンマ区切りリストです。この属性は、OSGi サービス・フィルターを指定します。

以下に例を示します。
Application-ExportService: com.myclub.memberService; filter="(level=silver)"

リモート化可能サービスは、値による受け渡しのセマンティクスをサポートしていなければなりません。 Application-ExportService ヘッダーによってエクスポートされたサービスと突き合わせるには、サービスがリモート可能 (つまり、 service.exported.interfaces プロパティーに登録されている) として構成されている必要があります。これにより、ローカル呼び出しのみをサポートし、参照による受け渡しセマンティクスを予期するサービスの偶発的な公開や使用を防止できます。

Use-Bundle
Application-Content リスト内のバンドルのパッケージ依存関係を満たすために 使用するバンドルまたは複合バンドルのリスト。 Use-Bundle リスト内の各バンドルまたは 複合バンドルは、Application-Content リスト内の少なくとも 1 つのバンドルに対して、 少なくとも 1 つのパッケージを提供する必要があります。 これらのバンドルは、 ランタイムで共有バンドル・スペースにプロビジョンされます。

Use-Bundle ヘッダーは 不要なことが多いものの、これがあると便利な場合もあります。 このヘッダーは、共有が可能になるレベルを制限するために使用できます。 例えば、1 つのアプリケーションが、パッケージ・インポートで、 既にテスト済みの同じバンドルを確実に使用するように指定できます。 あるいは、2 つのアプリケーションがパッケージ・インポートで同じバンドルを 確実に使用するように指定できます。 アプリケーション・レベルでの制限を設定すると、 バンドルを柔軟に保つことができます。