2

シナリオは次のとおりです。

バンドル「BundleA」をインストールして、OSGiコンテナーで開始しました。BundleAの新しいバージョンが利用可能です。BundleAは、Felixバンドルリポジトリを使用してプロビジョニングされます。BundleAの新しいバージョンは、「BundleB」からのパッケージに新しいパッケージレベルの要件を宣言します。

BundleAを更新する前に(OBRのdeploy()を使用して)、すべてのスレッドの実行を停止したいのでBundleAを停止し、非アクティブ化機能がこの機能を提供します。

BundleAでdeploy()を実行すると、予想どおりBundleBもインストールされます。

次に、プログラムでBundleAを再度start()すると、BundleAが起動します。ただし、BundleBは「アクティブ」ではなく「解決済み」です。BundleBを手動で起動でき、期待どおりに機能します

これは、私がプログラムでOSGi APIを呼び出す方法に関連して予想されますか、それとも何か問題が発生しましたか?

4

2 に答える 2

2

これが予想されるデフォルトの動作です。

バンドルのクラスがロードされるとすぐに、バンドルの自動アクティブ化を有効にできます。そのためには、Bundle-ActivationPolicy: lazyヘッダーを設定する必要があります。

Eclipseでは、[概要]ページのマニフェストエディターの[クラスの1つがロードされたときにこのプラグインをアクティブ化する]チェックボックスがあります。

于 2012-09-28T10:35:53.597 に答える
2

OSGiフレームワークはバンドルを自動的に開始しません。(ただし、フレームワークの起動時に以前に開始されたバンドルを再起動します。)フレームワークはバンドル間の開始依存関係について何も認識していません。バンドルは特定の開始順序を必要としないはずです。Gunnarが述べたように、アクティベーションポリシーを使用してレイジーアクティベーションをトリガーできますが、レイジーアクティベーションポリシーを使用してバンドルでstartを呼び出さなかった場合は、何も実行されません。

于 2012-09-28T11:42:06.257 に答える