我有一个简单的java项目,名为server。此外,我还有一个osgi项目,它定义了一个接口BlockProvider。接下来,我有一个带有实现BlockProvider的服务的osgi声明性服务项目。
在我的java项目“服务器”中,我有一个嵌入式osgi框架(在我的例子中是felix)。
我创建了一个bundleactivator,用于安装gogo包、scr包、我的api项目包和服务项目包。
工作没有问题,我可以检查我的服务包。
在我的服务器项目中,我希望看到哪些服务实现了BlockProvider接口。因此,我用"BlockProvider.class.getName()“作为第二个参数(筛选器)实现了一个BlockProvider.class.getName。
工作也没有问题,getServices()返回我的服务项目。
但是接下来的问题是:我不能在接口BlockProvider上调用任何函数,因为“服务器”项目中的BlockProvider使用的类加载器(sun.misc.Launcher$AppClassLoader@4e0e2f2a)与服务项目(o: yellowblock 6)不同。
我怀疑我在这里忽略了一些基本的东西:但是如何调用实现我的BlockProvider接口的BlockProvider服务的函数呢?
发布于 2015-12-06 15:13:47
只有当OSGi包由system /框架提供时,才能访问外部的服务。因此,您不应该安装API,而应该使用框架属性org.osgi.framework.system.packages.extra导出您的API包。
发布于 2015-12-06 20:59:07
这里有两条重要的规则。
嵌入OSGi时,OSGi之外的应用程序代码将被视为系统包的一部分。如果希望系统包通过服务与另一个包对话,那么结合上述两条规则意味着API包必须由系统包导出。无论系统包是服务的提供者还是使用者,这仍然是正确的。
因此,API包必须包含在嵌入应用程序的系统类路径中,并在使用OSGi属性设置org.osgi.framework.system.packages.extra框架时从系统包导出。
https://stackoverflow.com/questions/34117386
复制相似问题