2

问题

我在 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 模块添加到环境中,问题变成了我在转换类型时遇到的问题。

4

2 回答 2

4

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

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

于 2012-09-13T12:10:13.407 回答
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);
于 2014-10-18T23:52:34.510 回答