2012-09-13 32 views
1

问题嵌入式菲利克斯无法施展活化剂的BundleActivator

我有我的实例的OSGi bundle激活在菲利克斯OSGi容器中的一个问题。当我尝试启动捆绑包时,出现错误,我无法将激活码类型投射到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构建的包,但不包含任何OSGi引用。 SubProjectImpl引用Api模块并提供一个BundleActivator。为了解决OSGi类,该项目依赖于org.osgi:org.osgi.core:5.0.0。一切都很好。

SubProjectIntegrationTest项目提供了一组单元测试,以确保SubProjectImpl在嵌入式Felix环境中正常工作。我按照指南设置Felix实例(创建Activators,引用所需的罐子等)。由于测试环境和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)))) 

我以为菲利克斯环境会自动提供这些类。我将org.osgi.core模块添加到了环境中,问题变成了我使用的类型。

回答

2

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

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

+1

谢谢。我已经转向使用'org.apache.felix:org.apache.felix.main:4.0.3'来提供Maven构建中的OSGi组件,但不喜欢指定供应商特定的OSGi,但构建的确如此工作和组件在嵌入式Felix中启动。然后我改为'org.osgi:org.osgi.core:4.3.0',这也起作用了。激活的bundle现在不包含任何OSGi依赖项。 – Lance

+0

为了强调一下,导入一个包和在你的包中嵌入一组类是有很大区别的。导入很好,但嵌入会导致类路径混乱。使用Maven Bundle插件并不总是清楚你做了什么,所以值得检查一下你的清单和bundle,看看它为你带来了什么。听起来像'包含'意味着你知道它嵌入了你的依赖关系,但它是一种模棱两可的词。 –

+0

导入和嵌入有微妙的折衷。由于框架诊断出问题,导入更安全。由于您拥有更少的依赖关系,因此嵌入具有更易于使用的优势。 –

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); 
相关问题