1

bundleA、bundleB、および bundleC などの 3 つのバンドルで構成される GUI (swing) アプリケーションを実装しています。BundleContext.installBundle(String location) メソッドを使用して、これら 3 つのバンドルをすべて別のインストーラー バンドルにインストールします。

「UpgradeBundle」という名前の別のバンドルを使用して、既にインストールされている 3 つのバンドルのうちの 1 つを更新すると、問題が発生します。より正確に言うと、バンドルの更新には FrameworkWiring.refreshBundles の呼び出しが必要であると読んだので、BundleC.update(null) メソッドを呼び出してから FrameworkWiring.refreshBundles(BundlesForRefresh, null) メソッドを呼び出します。ただし、FrameworkWiring.refreshBundles を呼び出すと、(既に実行中のアプリケーション インスタンスで更新するのではなく) 更新されたバンドルで新しい GUI アプリケーションが起動されますが、既に実行中のアプリケーションは古いバンドルで実行され続けます。なぜこれが起こっているのですか?

この問題についてさらに詳しく説明する必要がある場合は、お知らせください。問題について詳しく説明します。

PS Equinox OSGi フレームワークを使用しています。

4

1 に答える 1

2

更新すると、更新されたバンドルの以前のバージョンへの参照を持つすべてのバンドルが停止します。stop メソッドが呼び出されたときに、アプリケーションが既存のインスタンスを適切にシャットダウンしていないと思います。次に、start メソッドが新しいものを作成します。

更新時にアプリがシャットダウンしないようにするには、システムを慎重に設計して、アプリから更新されたバンドルへのクラス ローダー参照がないようにする必要があります。インターフェイスに重点を置いたサービスは、これを実現するための優れた方法です。ただし、最終的には、参照を更新するためにアプリをシャットダウンする必要がある場合も多くあります。

于 2012-10-17T06:13:15.640 に答える