3

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

例如,如果我安装我的捆绑包,那么在我安装捆绑包之前不会解决Apache Felix依赖关系是否正确?我的包将尝试导入尚未导出的包。Apache Commons Logging 1.1.1Apache Commons Logging 1.1.1

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

提前感谢您的解释


编辑:我看到有一个名为 OBR 的 Apache Felix 子项目,它似乎有助于包管理(例如部署)。但是,我们已经有了一个包含本地存储库、私有存储库的 Maven 架构...... OBR 如何与 Maven 集成?

4

2 回答 2

7

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

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

Felix 和 Karaf 也支持 OBR,但您必须创建自己的 OBR Repo。目前没有公开的 OBR 存储库。OBR 的优点是可以解决大部分的传递依赖。Karaf 功能甚至可以与 OBR 一起使用,因此您只需在功能中列出一些顶级捆绑包,然后让 OBR 解决其余的问题。

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

于 2012-07-11T20:20:40.990 回答
2

OSGi 依赖项基于 Java 包:当一个包声明它需要导入给定包(指示可接受的版本范围)时,框架将尝试将该导入“连接”到该包的合适版本,即必须由另一个捆绑包导出。

如果找不到包,则该包将无法解析并且无法启动 - 所以是的,您需要安装应用程序所需的所有包,正如 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

于 2012-07-12T13:58:03.723 回答