我想根据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集成的?
提前感谢您的解释
编辑:我看到有一个名为OBR的Apache Felix子项目似乎有助于捆绑管理(例如部署)。但是,我们已经有了Maven架构和本地存储库,私有存储库...... OBR如何集成到Maven?
答案 0 :(得分:7)
如果您想将OSGi与maven一起使用,那么我推荐Apache Karaf作为可以使用Felix OSGi框架的服务器。优点是您可以使用mvn:urls直接从maven存储库安装捆绑包。
如果您只使用Apache Karaf和maven repo,那么您在运行时就没有传递解析。您必须安装所需的所有软件包。 karaf具有功能概念,这有很大帮助。因此,您可以将这些功能用作粗粒度构建块。您还可以在引用其他功能和捆绑包时创建自己的功能。这允许使用一个命令安装整个应用程序。
Felix和Karaf也支持OBR,但你必须创建自己的OBR回购。目前没有公共OBR回购。 OBR的优点是它可以解决大多数传递依赖性。 Karaf甚至可以与OBR一起使用,因此您可以在功能中列出一些顶级捆绑包,让OBR解决剩下的问题。
在实践中,我对没有OBR的简单Karaf功能有很好的体验。这是一些手工工作,但比你预期的要少,而且工作得很好。
答案 1 :(得分:2)
OSGi依赖项基于Java包:当bundle声明它需要导入给定的包(指示一系列可接受的版本)时,框架将尝试将该导入“连接”到合适的版本包,必须由另一个包导出。
如果无法找到软件包,该软件包将无法解析且无法启动 - 所以是的,您需要安装应用程序所需的所有软件包,并且正如Christian所示,有各种工具可以帮助您那。
获取所需捆绑包的一种简单方法是使用maven-dependencies-plugin从Maven的依赖项列表中获取捆绑包,并将它们复制到应用程序可以在启动时找到它们的位置进行安装,如[2]中所做的那样。 ](在launcher / pom.xml中),我写的一个小示例应用程序。
你也可以使用Sling的maven-launchpad-plugin [3]来生成一个可运行的jar文件,它嵌入了OSGi框架和你需要的所有软件包,并在启动时设置了所有内容。
关于导入和导出 - 无需详细说明,假设您使用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