Karaf PaxExam 得到 java.lang.IllegalStateException:无效的 BundleContext
Karaf PaxExam getting java.lang.IllegalStateException: Invalid BundleContext
您好,我正在使用 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 对象
当您使用无效的捆绑包时出现此异常:它已停止或刷新(刷新停止捆绑包并启动新实例)
当您安装一项功能时,默认情况下,Karaf 会尝试定义一个捆绑包列表以根据新功能进行刷新。例如,如果一个 bundle 对一个 package 有一个可选的依赖,并且新特性添加了这个 package,那么这个 bundle 将被刷新,以更新他的 wires。这是可传递的:所有依赖包也被刷新。
此外,当您使用 "wrap" 协议时,它会通过导入所有使用过的分辨率为 'optional'
的包从 jar 创建一个包
在你的情况下,我想功能 'DBHandler' 添加一个包,你的包会使用它。
你可以:
- 安装功能后,使用 BundleContext.getBundles() 通过 SymbolicName 查找您的包:您将拥有一个有效包的实例
- 使用选项
NoAutoRefreshBundles
在安装功能时禁用刷新 (featureService.installFeature("..", EnumSet.of(FeatureService.NoAutoRefreshBundles))
)。但这不是一个好主意,因为某些捆绑包将看不到新包
这段代码解决了我的问题
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();
}
您好,我正在使用 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 对象
当您使用无效的捆绑包时出现此异常:它已停止或刷新(刷新停止捆绑包并启动新实例)
当您安装一项功能时,默认情况下,Karaf 会尝试定义一个捆绑包列表以根据新功能进行刷新。例如,如果一个 bundle 对一个 package 有一个可选的依赖,并且新特性添加了这个 package,那么这个 bundle 将被刷新,以更新他的 wires。这是可传递的:所有依赖包也被刷新。
此外,当您使用 "wrap" 协议时,它会通过导入所有使用过的分辨率为 'optional'
的包从 jar 创建一个包在你的情况下,我想功能 'DBHandler' 添加一个包,你的包会使用它。
你可以:
- 安装功能后,使用 BundleContext.getBundles() 通过 SymbolicName 查找您的包:您将拥有一个有效包的实例
- 使用选项
NoAutoRefreshBundles
在安装功能时禁用刷新 (featureService.installFeature("..", EnumSet.of(FeatureService.NoAutoRefreshBundles))
)。但这不是一个好主意,因为某些捆绑包将看不到新包
这段代码解决了我的问题
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();
}