繁体   English   中英

嵌入式osgi框架,如何调用服务功能?

[英]Embedded osgi framework, how to call service functions?

我有一个简单的java项目,叫做server。 另外我有一个osgi api项目,它定义了一个接口BlockProvider。 接下来,我有一个osgi声明性服务项目,其中包含一个实现BlockProvider的服务。

在我的java项目'server'中,我有一个嵌入式osgi框架(在我的例子中是felix)。

我创建了一个bundleactivator,它安装了gogo osgi包,scr包,我的api项目包和服务项目包。

工作没有问题,我可以检查我的服务包。

在我的服务器项目中,我想看看哪些服务实现了BlockProvider接口。 所以我实现了一个ServiceTracker,其中“BlockProvider.class.getName()”作为第二个参数(过滤器一个)。

工作也没有问题,getServices()返回我的服务项目。

但是接下来是:我无法调用接口BlockProvider上的任何函数,因为'server'项目中的BlockProvider使用了与服务项目不同的类加载器(sun.misc.Launcher$AppClassLoader@4e0e2f2a)(o :黄色块[6])。

我怀疑我忽略了一些基本的东西:但是如何调用实现我的BlockProvider接口的BlockProvider服务的功能呢?

如果API包由系统包/框架提供,则只能从OSGi框架外部访问服务。 因此,您不应安装API包,而是使用框架属性org.osgi.framework.system.packages.extra导出API包。

这里有两个重要的规则适用。

  1. 当两个bundle通过服务进行通信时,他们必须同一个bundle中导入API包。 通常,您可以选择实际导出包的哪个包。 服务提供者可以导出它,在这种情况下,消费者必须从提供者导入它。 或者,您可以使用单独的“纯API”捆绑包导出API包,提供者和使用者都可以从中导入API包。 (很少,消费者捆绑包出口包,这在OSGi中是合法的,但有点奇怪的设计。)

  2. 系统包 - 即从OSGi内部表示OSGi Framework本身的特殊包 - 无法从任何普通包中导入包。 它只能导出。

嵌入OSGi时,OSGi之外的应用程序代码被视为系统包的一部分。 如果您希望系统包通过服务与另一个包进行通信,那么组合上述两个规则意味着必须由系统包导出API包。 无论系统捆绑包是服务的提供者还是消费者,这都是正确的。

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

暂无
暂无

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

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