使用OSGi进行依赖关系管理



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

例如,如果我在Apache Felix中安装我的捆绑包,那么在我也安装了Apache Commons Logging 1.1.1的捆绑包之前,对Apache Commons Logging 1.1.1的依赖关系不会得到解决,这对吗?我的捆绑包将尝试导入尚未导出的包。

我真的不明白依赖关系管理在OSGi世界中是如何工作的。我应该安装应用程序所需的每个捆绑包吗?另外,我不明白它是如何与Maven集成的?

提前感谢您的解释


EDIT:我看到Apache Felix的一个子项目名为OBR,它似乎有助于捆绑包管理(例如部署)。但是,我们已经有了Maven体系结构,包括本地存储库、私有存储库。。。OBR是如何集成到Maven的?

如果您想将OSGi与maven一起使用,那么我推荐ApacheKaraf作为可以使用Felix OSGi框架的服务器。优点是可以使用mvn:url直接从maven存储库安装捆绑包。

如果您只是将ApacheKaraf与maven repo一起使用,那么在运行时就没有可传递的解析。您必须安装所需的所有捆绑包。帮助很大的是karaf有功能的概念。因此,您可以将这些特性用作粗粒度的构建块。您还可以在引用其他功能和捆绑包的地方创建自己的功能。这允许使用一个命令安装整个应用程序。

Felix和Karaf也支持OBR,但你必须创建自己的OBR Repo。目前没有公开的OBR回购。OBR的优点是它可以解决大多数传递依赖关系。Karaf功能甚至可以与OBR协同工作,因此您可以在功能中列出一些顶级捆绑包,并让OBR解决其余问题。

在实践中,我对没有OBR的简单Karaf功能有很好的体验。这是一些手工工作,但比你预期的要少,而且效果很好。

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

如果找不到软件包,捆绑包将无法解析,也无法启动-因此,是的,您需要安装应用程序所需的所有捆绑包,正如Christian所指出的,有各种工具可以帮助您做到这一点。

获得所需捆绑包的一个简单方法是使用maven依赖项插件从maven的依赖项列表中获取捆绑包,并将它们复制到应用程序启动时可以找到的地方进行安装,如我编写的一个小示例应用程序[2](在launcher/pom.xml中)中所做的那样。

您还可以使用Sling的maven启动板插件[3]生成一个可运行的jar文件,该文件嵌入OSGi框架和您需要的所有捆绑包,并在启动时设置所有内容。

关于导入和导出-不需要详细说明,假设您使用maven bundle插件[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

最新更新