OSGi(Open Service Gateway Initiative) Lab
OSGi(Open Service Gateway initiative)とは、もともとは1999年3月に、Sun、IBMを中心に設立された、情報家電の規格、仕様策定を行う国際団体の名称でした。現在ではOSGiは、「Javaモジュールの動的追加や実行を管理するためのフレームワーク」に関する仕様を表す言葉として使用されており、その仕様を策定する団体はOSGi Allicanceとなっています。
OSGiとは「Javaモジュールの動的追加や実行を管理するためのフレームワーク」の仕様
ここで、Javaモジュールと言っているのは.jarファイルに代表される、javaのある機能を再利用するための塊だと思って下さい。その塊がいわゆるプラグインと呼ばれ、OSGiは「Javaでプラグイン構造を実現するための仕様」だともいえます。OSGiではプラグインのことを「バンドル(Bundle)」といいます。バンドル≒プラグインです。このサイトでは、OSGiに強く関係する所ではバンドルという表現を使用し、iDempiereに強く関係する所ではプラグインという表現を使用しています。
OSGiの仕様策定団体:OSGi Allicance
OSGiの仕様策定を行うOSGi Allianceには、現在は通信/家電/パソコン/自動車関連会社など多数の団体が参加しています。そして、名だたる日本企業も多数参加しています。
動的機能追加
JavaVMを停止させる事無く(≒サーバーを停止させる事無く)、バンドルをインストールし機能を追加する事ができます。
部品化
バンドルをブロックのように組み立ててアプリケーションを構築します。この事により、ハード依存、プロトコル依存部分の切り出しが容易になり、組み合わせにより様々なパターンに対応でき、不具合発生時の影響範囲も特定しやすくなります。
OSGiでは、バンドルを組み合わせる事でアプリケーションを構築していきます。ここではバンドル連携の概念を説明します。OSGiでバンドルを連携する方法は大きく分けて2種類あります。「パッケージによる連携」と「サービスによる連携」です。
パッケージによる連携
バンドルは各々が独立しているため、そのままでは他のバンドルの持つクラスは使用できません。そこで、パッケージによる連携を行う事で、他のバンドルが持つクラスを使用する事ができます。
例えば、バンドルAに属するパッケージ”foo”を、他のバンドルで使用しても良いとする場合、バンドルAはパッケージ”foo”をExport-Package”として定義します。バンドルAのパッケージ”foo”に属するクラスを使用したいとバンドルBは、”Import-Package”として”foo”を設定する事で、”foo”に属するクラスを使用する事ができます。
サービスによる連携
サービスによる連携を行うと、他のバンドルが生成したインスタンスを使う事ができます。
例えば、バンドルAがNewして作成したインスタンスを、バンドルBに使用させたい場合などはサービスによる連携をする事になります。
連携方法の特徴
◆パッケージによる連携方法の特徴
- インスタンスを使用する側で生成します。
- 静的なメソッドを提供するユーティリティクラスや例外クラスなど、いつ誰が使用しても問題ないクラスを提供するのに適しています。
◆サービスによる連携方法の特徴
- インスタンスを提供する側で生成します。※使用する側は、渡されたインスタンスを利用するだけです。
- インスタンスを使用するタイミングがコントロールできる(されている)ため、状況に影響を受ける機能を提供するのに適しています。
OSGiは仕様ですので、その仕様の実装がいくつか存在します。ここではOSGiの実装として有名な3つのOSGiフレームワークを紹介します。
IBMが作成し、Eclipseに寄贈したOSGiフレームワーク。iDempiereで採用されているOSGiの実装です。
※equinoxは、昼と夜が同じ長さの日のことで、the vernal(spring) equinoxが春分、the autumnal equinoxが秋分です。
felixは、アパッチ財団が開発しているOSGiのフレームワークです。iDempiereでは、プラグイン(バンドル)のインストールなどを行う管理画面(Webコンソール)のみ利用しています。
concierge(コンシェルジュ)
組み込み専用の軽量なOSGiフレームワーク。