OSGi环境:如何在运行时更新类引用

时间:2013-01-30 13:54:19

标签: java osgi declarative-services

我在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。现在我无法使bundle C使用A_1.1.0.jar中包含的新版MyBean类。

我该怎么做?

非常感谢!

祝你好运

cghersi

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

AFAIK,你做不到。在我的脑海中,我认为你已经将bundle A移动到INSTALLED状态,这可能也会将任何依赖项置于INSTALLED状态。然后安装新版本的捆绑包,然后解决方案应选择新版本。

但我可能错了......