嵌入式Felix无法将激活器强制转换为BundleActivator

时间:2012-09-13 02:40:52

标签: java osgi apache-felix

问题

我在Felix OSGi容器中实例化我的OSGi包激活器时遇到问题。当我尝试启动bundle时,我得到一个错误,我无法将激活器类型转换为org.osgi.framework.BundleActivator,尽管这是父类在项目中定义的内容。

我已将org.osgi:org.osgi.core:5.0.0包含在已激活的包中,以便可以启动具有激活器的类。我是否需要在OSGi包中引用OSGi库,或者Felix容器是否应该为我提供它们?

无论是运行Felix嵌入还是从命令行运行,我都遇到同样的问题。

**解决方案**

事实证明,Felix中的OSGi版本比最新标准更旧。因为我是OSGi的新手,所以我抓住了所有最新的东西并开始开发。我已经从5.0.0版本回到了4.3.0版本。我注意到的唯一区别是API中缺少漂亮的泛型。

现在我的类是兼容的,可以在容器中启动时解析它们。以前的问题只是由于库的版本。

背景

我有一个Maven构建的项目没有启动,因为它无法找到org.osgi.framework(vesrion> = 1.7.0)的依赖项(!(版本> = 2.0.0))。

项目configuraiton是

Main
  SubProjectApi
  SubProjectImpl
  SubProjectIntegrationTest

SubProjectImpl与SubProjectApi的依赖关系。 SubProjectApi有一个使用maven-bundle-plugin构建的bundle,但不包含任何OSGi引用。 SubProjectImpl引用Api模块并提供BundleActivator。要解析OSGi类,项目依赖于org.osgi:org.osgi.core:5.0.0。一切都很好。

项目SubProjectIntegrationTest提供了一组单元测试,以确保SubProjectImpl在嵌入式Felix环境中正常工作。我已按照指南设置Felix实例(创建激活器,引用所需的Jars等)。因为测试环境和OSGi都需要相同的API类,所以我使用了org.osgi.framework.system.packages.extra配置选项来共享API类。

当测试开始时,产生了以下错误

ERROR: Bundle dsto.lod.simr.core [12] 
    Error starting file:target/SubProjectImpl.jar 
    (org.osgi.framework.BundleException: Unresolved constraint in bundle
    project.impl [12]: Unable to resolve 12.0: 
    missing requirement [12.0] osgi.wiring.package; 
    (&(osgi.wiring.package=org.osgi.framework)(version>=1.7.0)(!(version>=2.0.0))))

我认为Felix环境会自动提供这些类。我将org.osgi.core模块添加到环境中,问题变为我的铸造类型。

2 个答案:

答案 0 :(得分:4)

您不应安装Core API捆绑包。这些包由框架实现导出。如果您安装捆绑包并解析捆绑包,那么您的捆绑包和框架实现将为这些类使用不同的Class对象。

您还需要针对其版本小于或等于框架实现支持的版本的核心API版本进行编译。看起来你是针对核心5.0编译的,而框架实现是针对核心4.3(或者5.0以下的其他版本)。

答案 1 :(得分:0)

我在基于Maven的项目中遇到了问题,其中导入似乎是正确的。问题在于缓存了一些不正确的接口版本。它在清除缓存后起作用。

要在启动时始终清除缓存,我使用了配置参数org.osgi.framework.Constants.FRAMEWORK_STORAGE_CLEAN

Map<String, String> config = new HashMap<>();
config.put(Constants.FRAMEWORK_STORAGE_CLEAN, 
           Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);
Framework framework = frameworkFactory.newFramework(config);