任何人都可以告诉我
之间有什么区别依赖项vs import-packge vs embed-dependency
我真的迷失了看样本osgi包的pom文件。
如果默认maven <import-package>*</import-package>
语句解析了对其他bundle的依赖性。
为什么需要使用<dependency>
元素包含捆绑包?
编辑:我没有任何样本要放在这里。 问题是&#34;如何将捆绑包作为依赖关系来访问其捆绑包&gt;服务在另一个捆绑包中?&#34;
答案 0 :(得分:2)
Maven提供了广泛的依赖模型。一个项目有一个pom,pom指定它对其他poms的依赖。这是传递性的,因此具有一个依赖性可以下载一半的互联网。在maven中,您可以指定需要依赖编译类路径或运行时类路径。
在OSGi中,您应该创建一个可以在不同环境中使用的包。因此,bundle是一个使其依赖项显式的JAR。就像Maven一样,你可以让bundle依赖另一个bundle(Require-Bundle)。但是,要求另一个捆绑包变得非常脆弱。
OSGi因此具有基于功能的本机依赖模型。包出口是一种能力。在OSGi中,Bundle A不依赖于Bundle B,但它依赖于 package b。 (并且包应该代表合同/ API。)任何导出包b的包都将满足包A.这种模型有许多优点,它的最大优点是它不具有传递性。这为部署时间提供了极大的灵活性。
在OSGi中,关键目标是最小化依赖关系,并且只依赖于定义良好的API,从不实现,因此捆绑包很容易在许多不同的上下文中使用。
那么你如何在maven中构建它呢?
通常,您可以分析代码。然后它将创建一个清单,准确表达您的bundle所依赖的包。
但是,开源中很多代码的结构方式很可能不依赖于API。那么如何处理这些实现依赖?
使用embed依赖选项拖动来自maven pom的所有传递依赖项(并且可以很多)被拖入。我不会使用它。它很快但也很脏,因为你不知道你拖入了什么。
一般来说,我会仔细设计捆绑包。因此,bnd可以指定应包含构建路径中其他工件的哪些包。甚至还有一种方法可以让bnd计算特定命名空间所需的内容:
Conditional-Package: aQute.lib.*
这在第一次很难完美,你会发现你第一次跑步时错过了东西,所以它需要一些迭代。但是,至少你知道你的包内有什么。