您好我正在使用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
}
经过大量浏览后,我明白你需要刷新捆绑包。如何以编程方式执行并获取refeshed bundleContext对象
答案 0 :(得分:3)
当您使用无效的捆绑包时,您会遇到此异常:它已被停止或刷新(刷新会停止捆绑并启动新实例)
当您安装某项功能时,默认情况下,由于新功能,Karaf会尝试定义要刷新的捆绑包列表。例如,如果bundle对包具有可选的依赖关系,并且新功能添加此包,则将刷新此包以更新其连接。这是传递性的:所有依赖的包也都会刷新。
此外,当你使用" wrap"协议,它通过导入所有使用的包装分辨率'可选'
从jar创建一个包在您的情况下,我认为功能' DBHandler'添加捆绑包使用的包。
你可以:
NoAutoRefreshBundles
在安装功能(featureService.installFeature("..", EnumSet.of(FeatureService.NoAutoRefreshBundles))
)时禁用刷新。但这并不是一个好主意,因为某些捆绑包不会看到新包答案 1 :(得分:0)
此代码修复了我的问题
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();
}