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

Embedded osgi framework, how to call service functions?

我有一个简单的 java 项目,称为服务器。此外,我还有一个 osgi api 项目,它定义了一个接口 BlockProvider。接下来我有一个 osgi 声明性服务项目,其中包含一个实现 BlockProvider 的服务。

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

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

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

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

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

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

我怀疑我在这里忽略了一些基本的东西:但是我如何调用实现我的 BlockProvider 接口的 BlockProvider 服务的函数?

如果 API 包由系统包/框架提供,您只能从 OSGi 框架外部访问服务。所以你不应该安装 API 包,而是使用 framework property org.osgi.framework.system.packages.extra 导出你的 API 包。

这里有两条重要的规则。

  1. 当两个包通过服务进行通信时,它们必须都从同一个包[=28]导入API包=].通常您可以选择实际导出包的包。服务的提供者可以导出它,在这种情况下,消费者必须从提供者那里导入它。或者,您可以有一个单独的 "pure API" 包导出 API 包,并且提供者和消费者都从那里导入它。 (很少,消费者包导出包,这在 OSGi 中是合法的,但有点奇怪的设计。)

  2. 系统包——即从 OSGi 内部代表 OSGi 框架本身的特殊包——不能从任何普通包中导入包。只能导出。

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

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