“Import-Bundle”和“Require-Bundle”有什么区别?

时间:2012-07-19 11:33:19

标签: osgi spring-dm

spring source dm server specific Import-Bundle 和OSGi的 Require-Bundle 有什么区别?
我很困惑是否在我的项目中使用Import-Bundle或Require-Bundle。

3 个答案:

答案 0 :(得分:16)

Import-Bundle类似于Require-Bundle,它创建了对另一个bundle的完全依赖,包括该bundle的依赖。这个传递性很糟糕,因为你不知道你所依赖的是什么,创造了我们在面向对象编程中非常熟悉的臭名昭着的“big ball of mud”问题。

在OO中,我们通过使用接口找到了解决这种纠缠的方法,它们将实现与规范分开。 OSGi是围绕类似的服务合同的高阶概念构建的。这些契约(接口,权限,帮助程序类)存储在一个包中。在基于合同的编程中,您依赖于合同,而不是实现。因此,OSGi捆绑包应该依赖于包,因为它们代表合同。

 Import-Package               <=> interface
 Import-Bundle/Require-Bundle <=> implementation class

Import-Bundle不是OSGi,它是一个专有的Spring扩展。它是Require-Bundle的一种清洁形式;不清洁是支持一些Eclipse用例所必需的。 OSGi决定不采用这个头,因为如果你想从组件构建系统,Require-Bundle / Import-Bundle基本上就会被破坏。

答案 1 :(得分:2)

理想情况下,您应该尝试使用Import-Package。它使你的捆绑更少依赖彼此。它还允许显示您只依赖于捆绑的一部分。这对于管理版本也很重要。在OSGi中,您可以独立于包版本定义导出包的版本。因此,如果API确实发生了变化,您可以确保只更改API的版本。这可以使您的应用程序更易于管理。

答案 2 :(得分:2)

它在SpringSource上解释了here

总结:Import-Bundle将导入某个捆绑包的所有导出包,它将在部署时解析,而Require-Bundle确实需要具有该类型的捆绑包,并且该关系在运行时保持这种状态。

通常它们的行为几乎相同。例如,在以下情况下可能会有所不同:

  • 您已经拆分了多个包中存在的包&#39 ;:包,您可能会丢失&#39;与Import-Package / Import-Bundle的依赖关系,你只能用Require-Bundle表达(注意你真的应该避免拆分包,如果你可以

  • 我认为Bundle-&gt; Package解析是在部署 捆绑包时。如果将包含导出的捆绑包的捆绑包重新部署到具有不同导出的版本,我认为捆绑包不会注意到。说实话,我对这个不太确定。

总而言之,我要坚持使用OSGi标准:如果你真的需要它,可以使用Import-Package或Require-Bundle。您将拥有更多标题,但从长远来看,您还有更多选项。