2013-02-16 141 views
8

我想了解以下OSGI包VS JAR依赖

<dependency> 
     <groupId>com.myspace.order</groupId> 
     <artifactId>dal</artifactId> 
     <version>1.0.0-SNAPSHOT</version> 
    </dependency> 

<dependency> 
     <groupId>com.myspace.order</groupId> 
     <artifactId>dal</artifactId> 
     <version>1.0.0-SNAPSHOT</version> 
     <type>bundle</type> 
    </dependency> 

的dal神器本身的差别已经包装规定为束为:

<packaging>bundle</packaging> 

现在,当我部署达尔神器时,我将它看作是一个jar(其中包含一个清单)在repo中发布。在这种情况下,我应该对dal有什么依赖。它应该是类型捆绑还是jar?如果我在做OSGI,我想方法是将指定的类型指定为bundle。它是否正确?或者,我可以在这里只有一个jar依赖项吗?

回答

11

当你在Maven中声明一个依赖项时,你只能依赖于一个普通的Jar,而不是一个bundle,因为Maven不能识别OSGi环境限制。

看到这个问题:(!但应该)

Why can't maven find an osgi bundle dependency?

在一次编译你的项目,你不需要担心OSGi环境尚未...例如,它会如果您尝试使用不依赖于您所依赖的软件包导出的软件包,请不要投诉......

当您尝试在OSGi容器中部署软件包时,如果您正确地声明了对'dal'软件包的依赖关系你使用,当然包括版本(通常你应该离开Maven-bundle-plugin去做你基于你的POM),只有在容器中有一个包含正确版本(或版本范围)中所需软件包的软件包时才会解决该问题。

考虑到'dal'似乎已经是一个捆绑包,你只需要确保将你的捆绑包和'dal'部署在一起,一切都会正常工作。

但是,如果错误地添加上“DAL”的私有软件包的依赖关系,但Maven将愉快地编译它为你,当你在OSGi中抛出它,你会被讨厌的布线异常迎接:)

注意,bundle只是一个普通的jar,它在清单中包含OSGi元数据(Bundle-SymbolicName,Bundle-Version等)。所以如果你不使用OSGi,一个捆绑包可以像任何其他jar一样工作。

但无论如何,如果你想要一些更多的信息,看看这个问题:

What is the meaning of type "bundle" in a maven dependency?

+0

“为例,它不会,如果您尝试使用不是由你根据包导出包抱怨....“ 这是否意味着在运行时强制(并检测)OSGI依赖关系?我正在考虑在编译时验证导出包。 – Sudoer 2013-02-19 17:18:08

+1

当您在OSGi容器中安装软件包时,依赖关系将被解析。由于OSGi是一个动态环境,您可以随时安装捆绑软件包。如果捆绑软件达到RESOLVED状态,则可能会启动它。换句话说,安装是一种动态编译......如果该软件包通过了,那么可以保证在安装时所有导入都已满足,因此软件包可以开始使用。 – Renato 2013-02-19 22:14:58

+1

在实际尝试安装它之前,OSGi无法解析您的软件包依赖关系,因为这将取决于安装时可用的软件包集合。另一方面,Maven使用普通的Java编译过程,忽略OSGi可见性规则......这是主要的区别。 – Renato 2013-02-19 22:17:40