繁体   English   中英

无法获得对OSGi服务的有效参考

[英]Can't get a working reference to an OSGi service


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

第二个更重要的问题是,当我最终从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)的捆绑罐用作我项目的maven依赖项。 我也知道Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA osgi配置选项,该选项应强制捆绑软件使用主机应用程序中的软件包,但并没有帮助我。

这是我的项目的主类https://github.com/ArtemZ/osgi-study/blob/master/src/main/java/com/artemz/demo/Main.java这很麻烦,因为我尝试了不同的事情为了获得对服务的引用,但实际上没有一个对我有用。

希望有人会帮助我,因为我真的很想这个问题。

感谢您提供有关您正在做的事情的更多详细信息。 我已经关注了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版本并报告其是否有效吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM