我有2个OSGI捆绑包TestCommons,它们是服务提供者捆绑包和使用该服务的TestMyBundle。 现在我在testMyBundle中使用了Declarative服务,并基于我在TestMyBundle的Activator类中设置和取消设置。因此,只要找到TestCommons服务,就会调用setter方法,如果从OSGI取消注册TestCommons服务,则调用unsetter。
现在我想以编程方式更新TestCommons包,我使用org.osgi.framework.Bundle接口的update()方法来更新现有的包。 现在,如果我更新bundle,则不会调用Bundle TestMyBundle的setter和unsetter方法,并且不会通知bundle。如何以编程方式通知更新的从属捆绑包? 一种方法是刷新,但我无法手动刷新包。
这是我写的代码
Bundle[] bundle = context.getBundles();
String symbolicName = "TestCommons";
try {
FrameworkWiring frameworkWiring = null;
for (Bundle b : bundle) {
if (b.getSymbolicName().equalsIgnoreCase(symbolicName)) {
b.update(new FileInputStream(new File("/home/temp/TestCommons-0.0.1-SNAPSHOT.jar")));
frameworkWiring = context.getBundle().adapt(FrameworkWiring.class);
break;
}
}
frameworkWiring.refreshBundles(null);
} catch (Exception e) {
System.out.println("Exception occured while starting...");
e.printStackTrace();
}
}
现在,adapt()方法返回null。因此无法调用刷新。请更新我这里的问题以及可以采取哪些其他方法来实现捆绑更新。
任何线索都会受到赞赏。感谢...
答案 0 :(得分:2)
您的TestMyBundle未更新,因为服务的接口包已更新。因此,您已经走上了正确的轨道,需要刷新TestMyBundle以获取更改。
在实践中,您通常可以通过为api使用单独的包来避免这种情况。只要您不更新服务接口 - 而且应该很少 - 您只需更新服务包,客户端中的声明性服务组件就会获取新服务。
现在关于刷新包。您已经正确地需要FrameworkWiring,但只有系统包可以适应FrameworkWiring。所以这应该可以解决问题:
Bundle systemBundle = context.getBundle(0);
systemBundle.adapt(FrameworkWiring.class).refresh(null);
这将刷新所有捆绑包。