2

我在 OSGi 环境下面临以下问题:假设我有一个包 A 导出 com.mybiz.example 包。这个包,在它的 1.0.0 版本中,包含一个 bean 类 MyBean 以便

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

Bundle B 导出一个使用 MyBean 的接口 MyService:

public interface MyService {
 public MyBean getMyBean();
}

注意:在我们的架构中,MyBean 必须是类而不是接口。

Bundle 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 类进行热修复,就会出现问题。假设我需要添加一个字段和一些方法。然后,我有一个正在运行的 OSGi 环境,其中部署了包 A、B、C。

我的要求是我不能停止任何捆绑。

因此,在这些假设下,我部署了我的包 A 的一个新版本,比如 A_1.1.0.jar。现在我无法使包 C 使用 A_1.1.0.jar 中包含的新版本的 MyBean 类。

我该怎么做?

非常感谢你!

最好的祝福

盖尔西

4

2 回答 2

2

请参阅 BJ Hargrave 在 Equinox 邮件列表中给您的答案。为了其他 StackOverflow 用户,我将总结 BJ 的答案。

MyBean是服务的 API 或合同的一部分,并且捆绑包不能简单地即时重新加载 API。Bundle C 必须停止、刷新/解决,然后重新启动。

于 2013-01-30T18:07:40.393 回答
0

AFAIK,你不能。在我的脑海中,我认为您已将包 A 移至 INSTALLED 状态,这可能也会将任何依赖项置于 INSTALLED 状态。然后您安装新版本的捆绑包,然后解析应该选择新版本。

但我可能错了...

于 2013-01-30T14:05:28.463 回答