问题
我在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模块添加到环境中,问题变为我的铸造类型。
答案 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);