首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Karaf PaxExam getting java.lang.IllegalStateException:无效BundleContext

Karaf PaxExam getting java.lang.IllegalStateException:无效BundleContext
EN

Stack Overflow用户
提问于 2016-02-10 10:14:27
回答 2查看 1.8K关注 0票数 1

嗨,我正在使用FeaturesService和BundleContext在运行时加载一些特性和包。所有这些东西都装得很成功。之后,如果对BundleContext对象执行操作,我将得到java.lang.IllegalStateException:无效的bundlecontext。

代码语言:javascript
复制
@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对象

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-10 13:14:22

这段代码解决了我的问题

代码语言:javascript
复制
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();
    } 
票数 0
EN

Stack Overflow用户

发布于 2016-02-10 12:00:50

当您使用无效的包时会出现此异常:它已停止或刷新(刷新停止该包并启动一个新实例)

默认情况下,当您安装一个特性时,Karaf会尝试定义一个包列表以进行刷新,因为它具有新的功能。例如,如果一个包有一个可选的依赖包,并且新特性添加了这个包,那么这个包将被刷新,以便更新他的连线。这是传递的:所有依赖的包也会被刷新。

此外,当您使用“when”协议时,它通过导入带有一个可选解析的所有使用过的包从jar中创建一个包。

在您的例子中,我认为特性'DBHandler‘添加了一个包,该包由您的包使用。

你可以:

  • 安装这些特性之后,通过SymbolicName查找您的包,并使用BundleContext.getBundles():您将拥有一个有效包的实例
  • 使用选项NoAutoRefreshBundles在安装功能(featureService.installFeature("..", EnumSet.of(FeatureService.NoAutoRefreshBundles)))时禁用刷新。但这不是一个好主意,因为一些捆绑将看不到新的包
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35312310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档