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

时间:2015-12-06 12:25:41

标签: java osgi apache-felix

我有一个简单的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:yellowblock [6])。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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

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

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