问题
我在 Felix OSGi 容器中实例化我的 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)(!(version>=2.0.0)) 的依赖项。
项目配置为
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
实例的指南(创建激活器、引用所需的罐子等)。因为测试环境和 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 模块添加到环境中,问题变成了我在转换类型时遇到的问题。