2

OSGi 環境で次の問題に直面しています。com.mybiz.example パッケージをエクスポートするバンドル A があるとします。このパッケージのバージョン 1.0.0 には、Bean クラス MyBean が含まれているため、

public class MyBean {
 int var;
 public MyBean() { }
 public int getVar() { return var; }
 public void setVar(int v) { var = v; }
}

バンドル B は、MyBean を使用するインターフェース MyService をエクスポートします。

public interface MyService {
 public MyBean getMyBean();
}

注: 私たちのアーキテクチャでは、MyBean はインターフェイスではなくクラスである必要があります。

バンドル C は、MyService を宣言型サービスとして次のように使用します。

private AtomicReference<MyService> _serv = new AtomicReference<MyService>();
public void addMyService(MyService serv) {
 //this method is the one called by declarative services when Bundle B is started
 _serv.set(serv);
}

public void run() {
 ...

 MyBean x = _serv.getMyBean();
 //use x ...
}

MyBean クラスでホット フィックスを実行する必要がある場合、問題が発生します。フィールドといくつかのメソッドを追加する必要があるとしましょう。次に、バンドル A、B、C がデプロイされた実行中の OSGi 環境を取得しました。

私の要件は、バンドルを停止できないことです。

したがって、これらの仮説の下で、バンドル A の新しいバージョン、たとえば A_1.1.0.jar をデプロイします。A_1.1.0.jar に含まれる新しいバージョンの MyBean クラスを使用するバンドル C を作成できません。

どうすればいいですか?

どうもありがとうございました!

よろしくお願いします

シゲルシ

4

2 に答える 2

2

BJ Hargrave が Equinox メーリング リストで提供した回答を参照してください。他の StackOverflow ユーザーのために、BJ の回答を要約します。

MyBeanサービスの API またはコントラクトの一部であり、バンドルはその場で API を単純にリロードすることはできません。バンドル C を停止し、更新/解決してから、再度開始する必要があります。

于 2013-01-30T18:07:40.393 に答える
0

AFAIK、できません。頭のてっぺんから、バンドルAをINSTALLED状態に移行したと思いますが、おそらく依存関係もINSTALLED状態になります。次に、バンドルの新しいバージョンをインストールすると、解決策で新しいバージョンが選択されます。

しかし、私は間違っているかもしれません...

于 2013-01-30T14:05:28.463 に答える