我在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
答案 0 :(得分:2)
请参阅BJ Hargrave在Equinox邮件列表上给出的答案。为了其他StackOverflow用户,我将总结BJ的答案。
MyBean
是服务的API或合同的一部分,而捆绑包不能简单地重新加载API。必须停止,刷新/解析捆绑包C,然后重新启动。
答案 1 :(得分:0)
AFAIK,你做不到。在我的脑海中,我认为你已经将bundle A移动到INSTALLED状态,这可能也会将任何依赖项置于INSTALLED状态。然后安装新版本的捆绑包,然后解决方案应选择新版本。
但我可能错了......