发布的OSGI服务是否需要将其包导出?

时间:2012-01-09 09:43:32

标签: osgi

是否需要导出包含OSGI服务的软件包才能发布到服务注册表?或者发布到服务注册表是否满足了导出包的需要?

2 个答案:

答案 0 :(得分:3)

答案简短;第一个问题=否,第二个问题=否,那里没有"解决方法"

"按合同设计"发挥作用。基本上,我们为消费者提供了依赖于供应商和供应商实现的接口 - 这使我们的消费者代码与实现者的实现细节分离。有关概述和http://www.osgi.org/blog/2011/08/package-as-contract.html的详细信息,请参见http://en.wikipedia.org/wiki/Design_by_contract

鉴于接口(我们希望使用的API)和实现(API接口的具体实现)和使用者(希望使用接口实现的代码),使用OSGi,您有许多选择。

  1. 捆绑包可以提供接口和实现,但如果要在捆绑包本身之外使用此服务,则必须导出接口
  2. 为接口(它导出)和实现的其他bundle提供单独的bundle - 实现bundle必须导入接口的包,但不需要显示自己的实现。
  3. 数字2的优点包括允许多个提供者(OSGi使用可用于指定已注册服务和属性的元数据匹配的LDAP过滤器),并利用OSGi的动态绑定特性(即您可以更改实现提供者)在运行时)。

    要记住的一点是,使用者和提供者必须使用包版本和导出包所定义的相同类(换句话说,加载API类的包类加载器必须对于使用者和提供者)。

答案 1 :(得分:1)

服务的类型应该在导出的包中。键入服务并基于模块层的类型共享构建。因此,您需要确保服务的提供者和服务的使用者都可以共享相同的类型。因此,某些bundle必须导出包含该类型的包,以便提供者和使用者可以导入包。这允许框架验证服务的类型安全性。