2012-07-11 93 views
2

我想根据OSGi规范开发多模块应用程序。假设我的一个模块使用Apache Commons Logging 1.1.1。 Spring在其存储库中提供了一个Apache Commons Logging 1.1.1的捆绑版本,所以我可以在我的POM中添加相应的依赖项。使用OSGi的依赖管理

如果我安装我的Apache Felix例如捆绑,是不是正确的,直到我安装的Apache Commons Logging 1.1.1捆绑,以及依赖于Apache Commons Logging 1.1.1不会得到解决?我的包会尝试导入尚未导出的包。

我不太了解依赖关系管理在OSGi世界中的工作方式。我应该安装我的应用程序需要的每个包吗?另外,我不明白它如何与Maven集成?

预先感谢您的解释


编辑:我见过有阿帕奇菲利克斯称为OBR一个子项目,它似乎助长捆绑管理(例如部署)。但是,我们已经有了一个包含本地存储库,私有存储库的Maven体系结构...... OBR如何与Maven集成?

回答

7

如果你想和maven一起使用OSGi,那么我推荐Apache Karaf作为可以使用Felix OSGi框架的服务器。好处是你可以使用mvn:url直接从maven仓库安装bundle。

如果你只是使用Apache Karaf的maven回购,那么你在运行时没有传递解决方案。你必须安装你需要的所有软件包。卡拉夫具有特征的概念有什么帮助。因此,您可以将这些功能用作粗粒构建块。您还可以在引用其他功能和捆绑的情况下创建自己的功能。这允许使用一个命令安装整个应用程序。

菲利克斯和卡拉夫也支持OBR,但你必须创建自己的OBR回购。目前没有公开的OBR回购。 OBR的优点是它可以解决大部分的传递依赖。 Karaf功能甚至可以与OBR一起使用,因此您可以在该功能中列出一些顶级捆绑包,并让OBR解决其余问题。

在实践中,我有很好的经验,没有OBR的简单卡拉夫功能。这是一些手动工作,但比你想象的要少,工作得很好。

2

OSGi依赖关系基于Java包:当一个包声明它需要导入一个给定的包(表明一系列可接受的版本)时,框架将尝试将该导入“导线”到合适的版本该软件包必须由另一个软件包导出。

如果找不到软件包,软件包将无法解析并且无法启动 - 因此,您需要安装您的应用程序需要的所有软件包,并且Christian表示有各种工具可以帮助您接着就,随即。

获取所需包的一种简单方法是使用maven-dependencies-plugin从Maven的依赖关系列表中获取包并将它们复制到应用程序可以在启动时找到它们以安装它们的地方, 2](在launcher/pom.xml中),我写的一个小例子应用程序。

你也可以使用Sling的maven-launchpad-plugin [3]生成一个嵌入OSGi框架和你需要的所有bundle的可运行jar文件,并在启动时设置所有的东西。

关于导入和导出 - 没有深入细节,假设您使用maven-bundle-plugin [1]来构建捆绑包,您将指定要导出哪些包(其他包将不可见其他包),maven-bundle-plugin将生成(大多数情况下是自动的,但你可以根据需要重写)要导入的包的列表,所以如果你自己的代码在包你想要导出和内部实现包。

[1] http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html

[2] https://github.com/bdelacretaz/OSGi-for-mere-mortals

[3] http://sling.apache.org/site/maven-launchpad-plugin.html