嗨,我正在使用FeaturesService和BundleContext在运行时加载一些特性和包。所有这些东西都装得很成功。之后,如果对BundleContext对象执行操作,我将得到java.lang.IllegalStateException:无效的bundlecontext。
@Inject
FeaturesService service;
@Before
public void init() throws Exception{
service.installFeature("hibernate");
service.installFeature("hibernate-validator");
service.installFeature("transaction");
service.installFeature("jpa");
service.installFeature("hibernate-envers");
service.installFeature("hibernate-envers");
bc.installBundle("wrap:mvn:com.oracle/ojdbc6/11.2.0").start();
service.installFeature("DBHandler");
bc.getBundle(); // Fails
}经过大量浏览,我了解到您需要刷新这些包。如何编程实现并获得一个重新配置的bundleContext对象
发布于 2016-02-10 13:14:22
这段代码解决了我的问题
public void refreshBundles() {
Bundle currentBundle = FrameworkUtil.getBundle(MyTest.class);
if (currentBundle == null) {
return;
}
BundleContext bundleContext = currentBundle.getBundleContext();
if (bundleContext == null) {
return;
}
Bundle systemBundle = bundleContext.getBundle(0);
if (systemBundle == null) {
return;
}
FrameworkWiring frameworkWiring = systemBundle.adapt(FrameworkWiring.class);
frameworkWiring.refreshBundles(null);
bc = frameworkWiring.getBundle().getBundleContext();
} 发布于 2016-02-10 12:00:50
当您使用无效的包时会出现此异常:它已停止或刷新(刷新停止该包并启动一个新实例)
默认情况下,当您安装一个特性时,Karaf会尝试定义一个包列表以进行刷新,因为它具有新的功能。例如,如果一个包有一个可选的依赖包,并且新特性添加了这个包,那么这个包将被刷新,以便更新他的连线。这是传递的:所有依赖的包也会被刷新。
此外,当您使用“when”协议时,它通过导入带有一个可选解析的所有使用过的包从jar中创建一个包。
在您的例子中,我认为特性'DBHandler‘添加了一个包,该包由您的包使用。
你可以:
NoAutoRefreshBundles在安装功能(featureService.installFeature("..", EnumSet.of(FeatureService.NoAutoRefreshBundles)))时禁用刷新。但这不是一个好主意,因为一些捆绑将看不到新的包https://stackoverflow.com/questions/35312310
复制相似问题