【问题标题】:Do published OSGI services need to have their packages exported?已发布的 OSGI 服务是否需要导出其包?
【发布时间】:2012-01-09 09:43:31
【问题描述】:

是否需要导出包含 OSGI 服务的包才能发布到服务注册表?或者发布到服务注册表是否可以解决导出包的需要?

【问题讨论】:

    标签: osgi


    【解决方案1】:

    简短的答案;第一个问题 = 否,第二个问题 = 否,没有“解决方法”

    “按合同设计”的原则开始发挥作用。基本上,我们为消费者提供了一个接口来依赖和提供者来实现——这将我们的消费者代码解耦,以便我们实现者的实现细节。请参阅http://www.osgi.org/blog/2011/08/package-as-contract.html 以获得良好的概述和http://en.wikipedia.org/wiki/Design_by_contract

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

    1. 一个包可以同时提供接口和实现,但如果要在包本身之外使用此服务,它必须导出接口
    2. 为接口(它导出)和实现的其他包有一个单独的包 - 实现包必须导入接口的包,但不需要显示它们自己的实现。

    数字 2 的优点包括允许多个提供程序(OSGi 使用 LDAP 过滤器,可用于指定已注册服务属性上的元数据匹配),并利用 OSGi 的动态绑定特性(即您可以在运行时更改实现提供程序)。

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

    【讨论】:

      【解决方案2】:

      服务的类型应该在导出的包中。服务是类型化的,并建立在模块层的类型共享之上。所以你需要确保服务的提供者和服务的消费者都可以共享相同的类型。所以一些bundle必须导出包含该类型的包,以便提供者和消费者可以导入包。这允许框架验证服务的类型安全性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-29
        • 2010-12-19
        • 2020-07-15
        • 2012-07-13
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        相关资源
        最近更新 更多