2

OSGi フレームワークを使用するモジュラー アプリケーションがあります。ここでは、org.eclipse.equinox.common_3.4.0 OSGi コンテナーを使用しています。これで、アプリケーションはすべての osgi バンドルがインストールされてアクティブになった状態で既に実行されており、いくつかのアクションに基づいてハッシュ マップをループすることで、アクティブな OSGi バンドルをすべて UI に表示しています。ここでの要件は、アプリケーションが既に実行されている間に、ファイル システムから新しい OSGi バンドルをインストールすることです。この新しいバンドルをアプリケーションの OSGi コンテナーに渡して、このバンドルが開始されるようにします。

どうすればこれを達成できますか? OSGi バンドルを JarInputstream として読み取り、バンドル アクティベーターの完全修飾クラス パスを読み取り、Class.forName("") を使用してこれをインスタンス化し、BundleActivator インターフェイスに型をキャストしようとしました。しかし、それを開始している間、バンドルコンテキストを start メソッドの引数として取っています。

OSGi バンドルをコンテナに実用的に提供して、バンドルのインストールと開始を処理し、UI がこの新しいバンドル名をディスプレイに自動的に表示する方法はありますか?

4

1 に答える 1

6

ロードするファイルがあると仮定すると、次のようにバンドルをインストールできます。

void install( BundleContext context, File file) throws Exception {
    Bundle b = context.installBundle( file.toURI().toString() );
    b.start();
}

そして、それをアンインストールできます(ファイルがなくなった場合):

void uninstall( BundleContext context, File file) throws Exception {
    Bundle b = context.getBundle( file.toURI().toString() );
    b.uninstall();
}

activate または Declarative サービス コンポーネントの activate メソッドから BundleContext を取得します。これらは推奨される方法ですが、悲惨な場合には次の方法も使用できます。

BundleContext context = FrameworkUtil.getBundle( this.getClass() ).getBundleContext();

便利ですが、将来使用する可能性のあるメカニズムをバイパスするため、推奨される方法でコンテキストを取得する方がはるかに優れています

于 2013-03-15T07:39:46.807 に答える