2012-07-13 75 views
1

我正在使用maven(maven-bundle-plugin)和apache karaf在osgi bundle开发中迈出第一步。 我的问题是:我如何导入另一个包的包?使用maven bundle插件进行osgi开发并设置依赖关系

如果我有两个捆绑包A和B. 可以说捆绑包A导出一个包“package.from.bundle.A”。 这我可以捆绑项目的pom.xml声明:

... 
<instructions> 
... 
    <Export-Package> 
    package.from.bundle.A*;version=${project.version} 
    </Export-Package> 
    <Import-Package> 
     * 
    </Import-Package> 
</instructions> 
... 

但我怎么能声明,我想使用包捆B? 如果我只是写项目B的POM文件的进口包装标签之间的软件包名,这也不行......

... 
<instructions> 
... 
    <Export-Package> 
    </Export-Package> 
    <Import-Package> 
     package.from.bundle.A 
    </Import-Package> 
</instructions> 
... 

如何行家从哪个包项目这个包是关系到知道吗?我如何使用maven在我的bundle之间使用依赖关系?

谢谢

回答

1

Maven的捆绑插件使用BND的封面,它使用字节码分析,从编译后的代码追溯制定出进口之下。软件包导出更多的是设计,这就是为什么需要明确指定。

您可以查看目标文件夹中生成的清单,我建议您确保您了解您正在执行的操作。

+0

是的,但问题是,当我想要构建我的包(使用mvn安装)时,我最终得到一个构建失败说:未分解的引用[org.osgi.framework]由Bundle-类路径。在配置包中找到错误。当我参考上面的标签中显示的package“package.from.bundle.A”时,会发生这种情况,这对我来说似乎合乎逻辑,因为maven怎么知道在哪里找到这个包?我想我做的是完全错误的...... – Moonlit 2012-07-14 08:09:26

+0

你没有提到你的原始问题中的构建失败。 :) 你肯定不需要元素,因为它默认为*,它会导入你的包使用的所有包。清单在编译后生成,所以如果你有编译错误,那么这与你的配置中的内容有关。 听起来好像你需要依赖org.osgi.core来解决编译问题。 – 2012-07-14 12:13:39

+0

thanx的回复,我看了看,org.osgi.core依赖关系存在...但我想我找到了错误。是否真的有必要为另一个bundle设置maven dependency ...因此,如果bundle A依赖于bundle B,我还必须向bundle A的maven项目声明一个Maven依赖项(在B的pom.xml中)?如果我这样做,我不会在我做maven安装时遇到错误。 – Moonlit 2012-07-14 12:51:03

1

您必须将maven依赖关系设置为您需要的所有包。这对于maven中的编译步骤是必需的。然后,封面下的maven bundle插件或bnd将分析构建结果。它会自动检测您提供的所有软件包并将其导出,除非它们中包含一些名称,如impl。它还会检测您导入的所有包,并为它们创建Import-Package语句。所以在大多数情况下,您不必配置导入和导出。所以把它们留空并在罐子里检查Manifest。只有当它不正确时,你必须手动配置。如果你配置额外的进口不要忘记添加,*。如果您忘记了这一点,那么自动检测到的软件包不会被添加,您必须手动指定您通常不需要的软件包。