【问题标题】:Embedded osgi framework, how to call service functions?嵌入式osgi框架,如何调用服务函数?
【发布时间】:2015-12-06 12:25:41
【问题描述】:

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

在我的 java 项目“服务器”中,我有一个嵌入式 osgi 框架(在我的例子中是 felix)。

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

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

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

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

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

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

【问题讨论】:

标签: java osgi apache-felix


【解决方案1】:

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

【讨论】:

  • 干杯 @Neil Barlett 和 Christian Schneider,我已将我的 api 包添加到系统捆绑包中,它现在可以正常工作了!
【解决方案2】:

这里有两条重要的规则。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2014-08-24
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多