[英]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.