无法获取对 OSGi 服务的工作引用




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

第二个更重要的问题是,当我最终从bundlerepository bundle收到对RepositoryAdmin服务的引用时,我无法将其转换为org.apache.filex.bundlerepoository.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)的bundle jar作为我项目的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.filex.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版本并报告它是否有效吗?

最新更新