プラグインおよびバンドル

プラグインをサポートするメカニズムは、OSGi フレームワークを使用して実装されます。 この観点からは、プラグインは OSGi バンドルと同じものです。 バンドルとそれに関連したクラスは、Java クラス・ロードのプロセス、前提条件管理、およびバンドルのライフ・サイクルを指定し、実装します。 以後の説明において、プラグインおよびバンドルという用語は、フレームワークの特定のクラスについて説明する場合を除いて、同じものを指します。

プラグイン

プラグイン・クラスは、プラットフォームで実行されるプラグインを表します。 プラグイン・クラスは、プラグインのライフ・サイクルの局面と全体的なセマンティクスを集中させるのに便利な場所です。 プラグインは、ライフ・サイクルの開始および停止の局面に対して、特殊な機能を実装できます。 各ライフ・サイクル・メソッドには、 追加情報を提供する BundleContext への参照が含まれています。

ライフ・サイクルの開始部分は、特別に説明するに値します。 プラグインのコードをいっさい実行することなく、プラグインのマニフェスト・ファイルからプラグインについての情報を取得できることは、既に説明しました。 通常、ワークベンチでのユーザーの操作により、プラグインを開始する必要がある一連のイベントが発生します。 実装の観点からは、プラグインに含まれるクラスをロードする必要が生じるまで、プラグインが開始されることはありません。

start メソッドは、プラグインの初期化と登録の振る舞いを実装するのに便利な場所です。 ただし、プラグインはさまざまな異なる環境で開始できることを認識することが重要です。 オブジェクトの文字飾りアイコンの取得というような単純な操作によって、プラグインのクラスの 1 つをロードし、プラグインを開始することが可能です。 初期化が早すぎると、プラグインのコードおよびデータが、必要になるよりもかなり前にロードされることになります。 したがって、プラグインの初期化タスクを綿密に調べ、開始時の初期化実行に対する代案を検討することが重要です。

バンドル・コンテキスト

ライフ・サイクル管理は、OSGi の「バンドル」という用語と、プラットフォームの「プラグイン」という用語が一致する部分です。 プラグインが開始されるとき、プラグインには、プラグインに関連した情報を取得できる BundleContext への参照が指定されます。BundleContext を使用して、システム内の他のバンドルやプラグインに関する情報を検索することもできます。

BundleContext.getBundles() を使用すると、システム内のすべてのバンドルの配列を取得できます。 BundleEvent のリスナーを登録し、別のバンドルのライフ・サイクル状況に生じた変化をプラグインが認識できるようにすることができます。 詳しくは、BundleContext および BundleEvent の javadoc を参照してください。

3.0 より前は、同様の情報を提供するためにプラグイン・レジストリー (IPluginRegistry) が提供されていました。 例えば、このレジストリーでシステム内のすべてのプラグインの記述子を問い合わせることができます。 このレジストリーは現在推奨されていません。この目的のためには BundleContext を使用してください。 プラットフォーム・レジストリーは現在、拡張および拡張ポイントに関する情報を取得するためにだけ使用されています。

バンドル・アクティベーター

BundleActivator インターフェースは、プラグインに実装された開始および停止の振る舞いを定義します。 プラグイン・クラスはこの機能を実装するのに便利な場所ですが、 プラグインの設計に適した任意のクラスに BundleActivator クラスのインターフェースを実装するのは、完全にプラグイン開発者の自由です。 実際、特定のライフ・サイクル管理要件がない限り、プラグインがこのインターフェースを実装する必要はまったくありません。

バンドル

すべてのプラグインの下には、フレームワークが管理する OSGi バンドルがあります。 バンドルは、OSGi におけるモジュール性の単位です。 基本的には、バンドルとは単に、プラットフォームにインストールされたファイル (リソースおよびコード) のコレクションです。 各バンドルには独自の Java クラス・ローダーがあり、バンドル自体を開始、停止、およびアンインストールするためのプロトコルが含まれています。 Eclipse プラットフォームの観点からは、バンドルは 1 つの実装クラスにすぎません。 プラグイン開発者はバンドル・クラスを拡張せず、プラグインまたはその他の BundleActivator の実装を使用してプラグインを表します。