【问题标题】:Karaf PaxExam getting java.lang.IllegalStateException: Invalid BundleContextKaraf PaxExam 获取 java.lang.IllegalStateException: Invalid BundleContext
【发布时间】:2016-05-20 15:13:09
【问题描述】:

您好,我正在使用 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 对象

【问题讨论】:

    标签: osgi apache-karaf osgi-bundle karaf blueprint-osgi


    【解决方案1】:

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

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

    此外,当您使用“包装”协议时,它会通过导入所有使用的打包文件来从 jar 中创建一个捆绑包,并以“可选”分辨率进行

    在您的情况下,我认为“DBHandler”功能会添加一个包,供您的捆绑包使用。

    你可以:

    • 安装功能后,通过 SymbolicName 使用 BundleContext.getBundles() 查找您的捆绑包:您将拥有一个有效捆绑包的实例
    • 使用选项NoAutoRefreshBundles 在安装功能时禁用刷新 (featureService.installFeature("..", EnumSet.of(FeatureService.NoAutoRefreshBundles)))。但这不是一个好主意,因为某些捆绑包不会看到新包

    【讨论】:

    • Jermie 我找到了一种刷新和更新 bundleContext 的方法,它解决了我的问题
    • 如果有人期待使用 Jérémie 解决方案,请在 FeaturesService.Option 中查找枚举,而不是简单地 FeaturesService
    【解决方案2】:

    这段代码解决了我的问题

    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-05-22
      • 2016-05-15
      • 2017-01-28
      • 2016-11-29
      • 2011-10-08
      • 1970-01-01
      • 2010-10-08
      • 2014-03-02
      • 1970-01-01
      相关资源
      最近更新 更多