spring source dm server specific Import-Bundle 和OSGi的 Require-Bundle 有什么区别?
我很困惑是否在我的项目中使用Import-Bundle或Require-Bundle。
答案 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。您将拥有更多标题,但从长远来看,您还有更多选项。