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();
    }