首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入式osgi框架,如何调用服务函数?

嵌入式osgi框架,如何调用服务函数?
EN

Stack Overflow用户
提问于 2015-12-06 12:25:41
回答 2查看 488关注 0票数 2

我有一个简单的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服务的函数呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-06 15:13:47

只有当OSGi包由system /框架提供时,才能访问外部的服务。因此,您不应该安装API,而应该使用框架属性org.osgi.framework.system.packages.extra导出您的API包。

票数 4
EN

Stack Overflow用户

发布于 2015-12-06 20:59:07

这里有两条重要的规则。

  1. 当两个捆绑包通过服务进行通信时,它们必须同时从导入API包。通常,您可以选择实际导出包的包。服务提供者可以导出它,在这种情况下,使用者必须从提供者导入它。或者,您可以有一个单独的“纯API”包导出API包,提供者和消费者都从那里导入它。(消费者包很少会导出包,这在OSGi中是合法的,但有点奇怪的设计。)
  2. 系统包--即从内部表示OSGi框架本身的特殊包--不能从任何普通包中导入包。只能出口。

嵌入OSGi时,OSGi之外的应用程序代码将被视为系统包的一部分。如果希望系统包通过服务与另一个包对话,那么结合上述两条规则意味着API包必须由系统包导出。无论系统包是服务的提供者还是使用者,这仍然是正确的。

因此,API包必须包含在嵌入应用程序的系统类路径中,并在使用OSGi属性设置org.osgi.framework.system.packages.extra框架时从系统包导出。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34117386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档