6

Eclipseマニフェストエディターの「クラスの1つがロードされたときにこのプラグインをアクティブにする」チェックボックスが役立つことを知りたいです。

Eclipseは常に「遅延初期化」アプローチを使用していると思いました。このオプションは、プラグインの BundleActivator クラスに関連していますか? 初期化はアクティベーションと何か違うのですか?

ここに同様の質問がありますが、私はそれを完全には理解していません。

4

1 に答える 1

18

ボックスにチェックを入れると、次のヘッダーがマニフェストに設定されます。

Bundle-ActivationPolicy: lazy

「純粋な」OSGi がこれをどのように処理するかから始めます。バンドルが START_ACTIVATION_POLICY フラグで開始された場合、バンドルはSTARTING状態に入りますが、アクティベーターの start() メソッドは呼び出されず、ClassLoader はバンドルに割り当てられません。何らかの理由でバンドルからクラスをロードする必要があるまで、バンドルは STARTING のままです。その時点で、ClassLoader が割り当てられ、アクティベーター (存在する場合) がインスタンス化され、要求されたクラスがロードされる前にその start() メソッドが呼び出されます。

ただし、Eclipse は追加のセマンティクスを上に重ねます。背景として、Eclipse は、起動時間を最小限に抑えるために、常にバンドルの開始を回避しようとします。バンドルの非常に小さなコア セットがデフォルトで開始され (リストは configuration/config.ini にあります)、これらの 1 つが p2 "simpleconfigurator" と呼ばれます。simpleconfigurator はBundle-ActivationPolicy:lazyヘッダーを持つバンドルを探し、START_ACTIVATION_POLICY フラグでそれらを開始します... したがって、これらのバンドルは上記のように「遅延」して開始されます。

重要な点は、ヘッダーを含まない他のすべてのバンドルは、 Eclipseではまったく開始されないということです。これらは RESOLVED 状態のままで、アクティベーターは呼び出されず、Declarative Services コンポーネントが含まれている場合は読み込まれません。これは、Declarative Services が ACTIVE または STARTING 状態のバンドルのみを参照するためです。

したがって、ヘッダーを使用する主な理由は、Eclipse で動作する必要がある Declarative Services コンポーネントを含むバンドルを作成する場合です。

他の環境では、ヘッダーを使用する必要はありません。ほとんどの通常の OSGi アプリは、バンドルのサブセットを選択的に開始しようとするのではなく、単純にすべてのバンドルを開始します。これは、OSGi アプリが遅延読み込みを気にしないという意味ではないことに注意してください。Declarative Services は、バンドル クラスの読み込みトリガーをいじることなく、遅延読み込みを既にサポートしています。私の意見では、Eclipse はこれを誤解しており、バンドルのライフサイクルに不必要な複雑さを加えています。それでも、Eclipse で実行している場合は、Eclipse の制限を理解して作業する以外に選択肢はありません。

于 2013-07-11T11:40:54.617 に答える