获取java.lang.IllegalStateException的Karaf PaxExam:无效的BundleContext

时间:2016-02-10 10:14:28

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

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

2 个答案:

答案 0 :(得分:3)

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

当您安装某项功能时,默认情况下,由于新功能,Karaf会尝试定义要刷新的捆绑包列表。例如,如果bundle对包具有可选的依赖关系,并且新功能添加此包,则将刷新此包以更新其连接。这是传递性的:所有依赖的包也都会刷新。

此外,当你使用" wrap"协议,它通过导入所有使用的包装分辨率'可选'

从jar创建一个包

在您的情况下,我认为功能' DBHandler'添加捆绑包使用的包。

你可以:

  • 安装功能后,使用SymbuleName查找捆绑包,使用BundleContext.getBundles():您将拥有一个有效捆绑包的实例
  • 使用选项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();
    }