14

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

4

3 回答 3

17

Import-Bundle 与 Require-Bundle 类似,它创建对另一个包的完整依赖项,包括该包的依赖项。这种传递性很糟糕,因为您不知道自己依赖什么,从而产生了我们在面向对象编程中非常熟悉的臭名昭著的“大泥球”问题。

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

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

Import-Bundle 不是 OSGi,它是专有的 Spring 扩展。它是 Require-Bundle 的一种更简洁的形式;不洁是支持某些 Eclipse 用例所必需的。OSGi 决定不采用此标头,因为如果您想从组件构建系统,Require-Bundle/Import-Bundle 从根本上被破坏了。

于 2012-07-20T07:23:34.407 回答
2

理想情况下,您应该尝试改用 Import-Package。它使您的捆绑包彼此之间的依赖性降低。它还允许表明您仅依赖于捆绑包的一部分。这对于管理版本也很重要。在 OSGi 中,您可以定义独立于捆绑包版本的导出包的版本。因此,您可以确保仅在 API 真正更改时才更改其版本。这可以使您的应用程序更易于管理。

于 2012-07-19T14:20:30.893 回答
2

它在 SpringSource 中进行了解释

总结一下:Import-Bundle 会导入某个 bundle 的所有导出包,部署时会解决这个问题,而 Require-Bundle 确实需要该类型的 bundle,并且这种关系在运行时保持不变。

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

  • 您有“拆分包”:存在于多个包中的包,您可能会“丢失”与 Import-Package / Import-Bundle 的依赖关系,您只能用 Require-Bundle 表示(请注意,如果可以的话,您真的应该避免拆分包

  • 我认为 Bundle->Package 解决方案是在您部署捆绑包时。如果您将带有导出包的包重新部署到具有不同导出的版本,我认为包不会注意到。老实说,我不太确定这一点。

总而言之,如果你真的需要的话,我会说坚持使用 OSGi 标准:Import-Package 或 Require-Bundle。你会有更多的标题,但从长远来看,你会有更多的选择。

于 2012-07-19T16:33:53.670 回答