OSGi アプリケーションの分離と共有

実行時に、OSGi アプリケーションは相互に分離されますが、その依存関係は共有されます。

ランタイム環境では、OSGi アプリケーションは相互に分離されます。
  • OSGi アプリケーションは、パッケージを共有できません。
  • OSGi アプリケーションはそれぞれ、独自のサービス・レジストリーを持つ独自の分離された OSGi フレームワークで実行されます。
  • OSGi サービスは、アプリケーション・マニフェストに適切なヘッダーを設定することによって、フレームワーク間でインポートおよびエクスポートすることができます。

1 つ以上の OSGi アプリケーションを実行しているアプリケーション・サーバーにはそれぞれ、1 つの共有バンドル・スペースもあります。

OSGi アプリケーションのプライマリー・コンテンツは、アプリケーションのフレームワークで実行されます。 アプリケーション内の依存関係バンドルと共有バンドルは、共有バンドル・スペースで実行されます。

アプリケーションが開始されると、アプリケーションのデプロイメント・マニフェストにリストされているバンドルがランタイム環境にロードされます。 デプロイメント・マニフェストの Deployed-Content ヘッダーにリストされているバンドルが、分離されたフレームワークにロードされます。 デプロイメント・マニフェストの Deployed-Use-Bundle および Provision-Bundle ヘッダーにリストされているバンドルが、共有バンドル・スペースにロードされます。

共有バンドル・スペース内の依存関係バンドルは、内部バンドル・リポジトリー、外部バンドル・リポジトリー、またはアプリケーション内容から発生する場合があります。

しかし、アプリケーション内の共有バンドルは、アプリケーションに直接含まないで、参照によって提供する必要があります。 これは、共有バンドルがアプリケーションに直接含まれていると、他のアプリケーションが解決するときにそのアプリケーションで使用できないが、実行時に共有バンドル・スペースに存在すると、問題を発生させることがあるからです。

以下に、サンプルのアプリケーション・マニフェストを示します。
Manifest-Version: 1.0
Application-ManifestVersion: 1.0
Application-Name: Example Blog
Application-SymbolicName: example.blog.app
Application-Version: 1.0
Application-Content:
 example.blog.api;version="[1.0.0,2.0.0)", 
 example.blog;version="[1.0.0,2.0.0)"

依存関係が解決されると、デプロイされたアプリケーションは、バージョン 1.2.0 の 追加の従属バンドル blog.required.bundle を取り込む必要があります。 このバンドルは、パッケージ blog.required.package から入手できます。 このパッケージは、次の図に示すとおり、共有バンドル・スペース内の従属バンドルから、分離された両アプリケーション・フレームワーク内の バンドルに接続されます。

図1: アプリケーション・フレームワークと共有バンドル・スペース
画像は付随するテキストで説明されています