首页 文章

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

提问于
浏览
1

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

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

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

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

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

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

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

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

2 回答

  • 3

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

  • 3

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

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

    • 系统包 - 即从OSGi内部表示OSGi Framework本身的特殊包 - 来自任何普通包的 cannot import包 . 它只能导出 .

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

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

相关问题