我应该何时使用Import-Package,何时应该使用Require-Bundle?

AlB*_*lue 51 osgi

OSGi允许通过Import-Package连接确定依赖关系,它只连接单个包(从任何包中导出),并Require-Bundle连接到特定命名包的导出.

在构建绿地OSGi应用程序时,我应该使用哪种方法来表示依赖关系?大多数bundle都是内部的,但是对外部(开源)bundle会有一些依赖.

Thi*_*ilo 50

我相信它Require-Bundle是一个Eclipse的东西(现在已经在OSGi规范中使它适应Eclipse)."纯粹的"OSGi方式是使用Import-Package,因为它专门将包与提供它的包解耦.您应该声明依赖于您需要的功能(特定软件包的特定版本提供的Java API)而不是该功能的来源(这对您来说无关紧要).这使捆绑的组成更加灵活.

JavaScript类比:这类似于检测Web浏览器是否支持某个API,而不是根据用户代理字符串说明它是什么类型的浏览器.

OSGi联盟的Peter Kriens在OSGi博客上有更多关于此的内容.

可能是您需要使用的唯一情况Require-Bundle是,如果您有拆分包,那就是分布在多个包中的包.当然,非常不鼓励拆分包.

  • 我认为Thilo是对的.正如Peter Kriens在文章中提到的那样:"Require-Bundle具有直观的吸引力,很难否认." 但它不必要地捆绑在一起.在Java世界中,我会将它与IoC与直接查找依赖项进行比较.一个例子依赖于`commons-logging` bundle vs依赖于`commons-logging` API包.在后一种情况下,您可以轻松地将`common-logging`包与适当的SLF4J适配器包交换,该适配器也导出`commons-logging` API包,从而无缝地创建从`commons-logging`到SLF4J的桥. (6认同)
  • Require-Bundle和Import-Package都在OSGi规范中定义; 这两者没有"纯粹"的变体. (3认同)
  • @AlBlue:更新了我的答案,让我更清楚地知道虽然Require-Bundle在规范中,但它只是为了兼容Eclipse. (2认同)
  • +1,因为这是对该主题的很好的讨论。小补充:require-bundle 可用于表达与包不同的依赖关系,例如,一个 Bundle 需要另一个 Bundle 形式的资源。 (2认同)
  • 只是为了做一个观察 - 'Require bundle已经使它符合OSGi规范以适应Eclipse'实际上是不正确的.它是在OSGi 4中添加的,但大多数是Eclipse Import-Package.Eclipse 3.0于2004年6月转为使用OSGi; OSGi 4(带有Require-Bundle)于2005年8月发布. (2认同)

tek*_*ara 14

支持Import-Package over Require-Bundle.

需要束:

  • 指定要使用的显式包(和版本).如果需要重构一个requirde bundle并将一个包移到别处,那么dependents将需要更改他们的MANIFEST.MF
  • 使您可以访问捆绑包的所有导出,无论它们是什么,无论您是否需要它们.如果您不需要的部件有自己的依赖关系,那么您需要这些部件
  • 捆绑包可以重新导出
  • 虽然不鼓励,但允许使用拆分包,即:包含在多个包中的包
  • 可用于非代码依赖项,例如:resources,Help等.

进口包装:

  • 松散耦合,只指定包(和版本),运行时查找所需的包
  • 可以跳出实际的实现
  • 包所有者可以将依赖包移动到不同的包
  • 但是需要以较低的粒度级别维护更多元数据(即:每个包名称)


ome*_*dat 5

我相信Import-Package为您提供更宽松的耦合,应该是首选.我在声明对我不拥有的包的依赖时使用它,例如slf4j,我可以按照自己的意愿交换实现.当依赖是我可以控制的东西时,我使用Require-Bundle,例如我自己的bundle,因为无论如何任何重要的改变都会通过我自己.