【问题标题】:Can't get a working reference to an OSGi service无法获得对 OSGi 服务的工作参考
【发布时间】:2014-12-22 22:45:15
【问题描述】:


我正在尝试使用 maven 将 apache felix 嵌入到一个简单的 hello world java 项目中,但我找不到获取对捆绑服务的引用的方法。我已经将 org.apache.felix.bundlerepository 包从 jar 安装到 OSGi 中,并将其作为 maven 依赖项添加到我的项目中。之后,我开始捆绑,从中获取 BundleContext,然后在该捆绑上下文上调用 getServiceReference(RepositoryAdmin.class.getName())。我不满意的第一件事是我必须使用已安装包中的 BundleContext,如果我使用框架的 BundleContext,则 ServiceReference 将始终为空。这不方便。

第二个更重要的问题是,当我最终从 bundlerepository 包中收到对 RepositoryAdmin 服务的引用时,我无法将其转换为 org.apache.felix.bundlerepository.RepositoryAdmin,执行以下代码:

(RepositoryAdmin)admin.getBundleContext().getService(ref)

会抛出这个异常:

java.lang.ClassCastException: org.apache.felix.bundlerepository.impl.RepositoryAdminImpl cannot be cast to org.apache.felix.bundlerepository.RepositoryAdmin 

我知道这是一种类路径问题,可能是由接口不兼容引起的,但我使用相同版本(2.0.2)的捆绑 jar 作为我项目的 maven 依赖项。 我也知道 Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA osgi 配置选项应该强制捆绑使用来自主机应用程序的包,但它没有帮助我。

这是我的项目https://github.com/ArtemZ/osgi-study/blob/master/src/main/java/com/artemz/demo/Main.java 的主类,它很乱,因为我在上面尝试了不同的东西以获取对服务的引用,但实际上没有一个对我有用。

希望有人能帮助我,因为我对这个问题真的很绝望。

【问题讨论】:

    标签: java osgi apache-felix


    【解决方案1】:

    感谢您提供有关您所做工作的更多详细信息。我已经关注了 felix 列表中的邮件。 现在我想我明白会发生什么了。无法从 RepositoryAdmin 捆绑包之外获取服务的原因是您在中定义的包

    FRAMEWORK_SYSTEMPACKAGES_EXTRA 是“org.apache.felix.bundlerepository;版本=2.0.2”

    与 RepositoryAdmin 捆绑包中的软件包版本不同。我下载了捆绑包并查看了清单:

    Export-Package: org.osgi.service.repository;version="1.0";uses:="org.osg
     i.resource",org.apache.felix.bundlerepository;version="2.1";uses:="org.
     osgi.framework"
    

    因此,如您所见,您应该从系统捆绑包中导出的版本是 2.1 而不是 2.0.2。 在 OSGi 中,版本是按包定义的,而不是在捆绑包级别上定义的。因此,尽管大多数时候它们是相同的,但这并不总是正确的。尤其适用于 OSGi 规范包。

    所以当包版本不同时,你有两种效果: 1.您将无法找到具有不同套餐的服务 2. 如果您以其他方式获取服务对象,那么您将遇到类转换异常,因为它们是由不同的类加载器加载的。

    那么你可以试试 2.1 版本并报告它是否有效?

    【讨论】:

    • 哇,这实际上帮助了我!太感谢了!我希望一个版本为 2.0.2 的捆绑包可以导出具有相同版本的包......我错了。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2020-10-08
    • 2012-04-29
    • 1970-01-01
    相关资源
    最近更新 更多