2015-12-16 135 views
0

可以在任何一个告诉我是什么VS进口装箱率VS嵌入依赖性OSGi的Maven依赖VS进口装箱率VS嵌入依赖性

依赖之间的差异

我真的失去了看样品osgi包的pom文件。

如果默认maven <import-package>*</import-package>语句解决了对其他包的依赖性。

为什么需要使用<dependency>元素包含该包?

编辑:我没有任何样品放在这里。 问题是“如何将一个bundle作为一个依赖项来访问它的包 - >不同包中的服务?”

+0

我不明白。你能更具体一点吗?也许用一个样本pom和你不明白的地方。 –

回答

2

Maven提供了广泛的依赖模型。一个项目有一个pom,那个pom指定了它对其他poms的依赖关系。这是传递性的,所以有一个依赖可以下载一半的互联网。在maven中,您可以指定您需要依赖于您的编译类路径或运行时类路径。

在OSGi中,您应该创建一个可以在不同环境中使用的包。出于这个原因,一个bundle是一个JAR,它使得它的依赖性是明确的。就像Maven一样,你可以让一个bundle依赖另一个bundle(Require-Bundle)。但是,需要另一个捆绑包变得相当脆弱。

  • 也容易产生较大的依赖关系图
  • 您可以轻松地在您需要在不同版本的同一工件的情况得到
  • 您需要的方式很多,因为你往往只需要另一束
  • 的一部分
  • 你经常喜欢用不同的实现

因此OSGi的具有基于能力本地依赖模型。包出口是一种能力。在OSGi中,捆绑包A不依赖于捆绑包B,但它取决于 b。 (包应该代表一个合约/ API。)任何导出包b的包都会满足包A.这个模型有很多优点,它的最大优点是它不是传递的。这为部署时间提供了巨大的灵活性。

在OSGi中,一个关键目标是最小化依赖关系,并且只依赖于定义良好的API,从不实现,因此该包在许多不同的上下文中很容易使用。

那么你如何在maven中构造它?

一般来说,你让bnd分析你的代码。然后,它会创建一个清单,用于精确地表达您的软件包依赖于哪些软件包。

但是,开源代码中很多代码的构造方式很可能并不仅仅依赖于API。那么你如何处理这些实现依赖关系?

使用嵌入依赖项选项,您可以拖入maven pom中的所有传递依赖项(并且可以是很多),但我不会使用它。它很快但也很脏,因为你不知道你拖入什么。

一般来说,我会仔细设计包裹。 bnd因此可以指定包含来自构建路径上其他工件的哪些包。甚至有一种让BND计算是从特定的命名空间需要什么:

Conditional-Package: aQute.lib.* 

这种情况很少完美的作品第一次,你会发现你会错过的东西,你跑那么这将需要一些反复的第一次。但是,至少你知道你的包里面有什么。