无法获得OSGi服务的工作参考

时间:2014-10-27 17:07:47

标签: java osgi apache-felix


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

第二个更重要的问题是,当我最终从bundlerepository bundle收到对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的主要类,它是杂乱的,因为我正在尝试不同的东西,以获得对服务的引用,但没有一个实际上对我有用。

希望有人会帮助我,因为我真的非常渴望这个问题。

1 个答案:

答案 0 :(得分:4)

感谢您提供有关您正在做的事情的更多详细信息。我已经关注了felix列表上的邮件。 现在我想我明白会发生什么。您无法从RepositoryAdmin包外部获取服务的原因是您在

中定义的包

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

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

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版本并报告它是否有效吗?