##はじめに
以前OSGiについて調べた結果をまとめたものです。
(ちょっと古い情報もあるかもしれませんのであしからず)
##OSGiとは
- OSGi Alliance(標準化団体) が規定する、Javaをベースとしたソフトウェア部品化技術に関する仕様
- Javaのパッケージやクラスの管理を詳細に規定
##背景
- 当初は家庭や小規模オフィス向けのゲートウェイ装置で動作するサービスプログラムの実行基盤を対象としていた対象を車載機器やモバイル端末、エンタープライズシステムに拡大
- Eclipse 3.0がプラグイン管理システムとしてOSGi仕様を採用し、Javaの世界での知名度が向上
- Javaのコンポーネント志向のプラットフォームとして不足している部分を補うものとして注目されている
##特徴
- モジュール管理の仕組みを規定
- 管理単位の一貫性
- 開発時も実行時もバンドル(jar)単位で扱う
- 依存関係
- モジュール外部に公開するインターフェースや、依存先の明示
- モジュール毎に独立したクラスローダー
- 実行時ではなく、ロード時に依存関係のチェックを行う
- バージョン管理
- 動的モジュール交換
- 管理単位の一貫性
- 実績と多くの実装系の存在
- Equinox
- Apache Felix
- Knopflerfish
##OSGiバンドル
- バンドル: OSGiにおけるモジュールの管理単位
- OSGiではアプリケーション部品(jar)を「バンドル」と定義
- バンドル≒ jar
- バンドルとしての定義 => jarのマニフェスト・ファイルに、OSGi特有の属性(メタ・データ)を追加
- jarの仕組みをそのまま利用しているため、OSGiバンドルはOSGiコンテナのない通常の環境では単なるjarファイルとして扱える
##OSGiバンドルManifest
Manifest-Version: 1.0
Bundle-SymbolicName: com.ibm.jp.myapp
Bundle-Name: My Application Bundle
Bundle-Vendor: IBM Japan
Bundle-Version: 2.0.0
Import-Package:
com.ibm.jp.mylib1.ui;version="[1.2.0,1.3.0)",
com.ibm.jp.mylib1.util;version="[1.2.0,1.3.0)"
Export-Package:
com.ibm.jp.myapp;version="2.0.0"
Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-Activator: com.ibm.jp.myapp.MyAppActivator
##OSGiによるモジュール管理
- 依存関係の明確化
- アクセス制御
- 従来のJavaの仕組み(private, public, protectedのアクセス修飾子等)に加え、バンドル間でのアクセス制御が可能
- 設計モデルと実行モデルの一貫性
- バージョン管理
- 依存関係のトレーサビリティー
- 変更が入った場合の影響範囲の特定
- アクセス制御
##jarの依存関係についての補足(1/2)
OSGiバンドル間は、大きく分けてTightly-Coupled, Loosely-Coupled という連携形態があります。
Tightly-Coupled:
ベーシックな方法としてパッケージの単位でExport/Importによる依存関係を定義でき、これをTightly-Coupledと呼んでいます。OSGi バンドル間は直接的な依存関係を持つため、Exportしている側の入れ替えはImportしている側に影響します。
Loosely-Coupled:
Tightly-Coupledのような直接的な依存関係ではなく、インターフェース部分と実装部分を別OSGi バンドルに分けるような構成をとると、インターフェース部分が仲介となって、親(使う側)と子(使われる側)は直接的な依存関係が無くなり、柔軟な変更管理ができるようになります。このような構成をLoosely-Coupledと呼んでいます。
##jarの依存関係についての補足(2/2)
OSGiでは、Loosely-Coupledを実現するメカニズムをいくつか提供しています。例えばOSGi Service機能を介することで、サービスを動的に登録したり参照することができ、直接的に依存関係にないOSGiバンドル間での連携ができます。その他、Blueprintというプログラミング・モデルを使う方法がベストプラクティスとして上げられています。