如何管理 OSGi 构建依赖项?

Posted

技术标签:

【中文标题】如何管理 OSGi 构建依赖项?【英文标题】:How can I manage OSGi build dependencies? 【发布时间】:2010-09-06 20:51:20 【问题描述】:

我们已将 OSGi 运行时 (Equinox) 嵌入到自定义客户端-服务器应用程序中,以促进插件开发,目前一切进展顺利。由于内置的​​清单编辑器、依赖管理和导出向导,我们一直在使用 Eclipse 构建插件。使用 Eclipse 来管理构建对于通过 Hudson 进行持续集成不是很有帮助。

我们有依赖于其他 OSGi 包的 OSGi 包。我真的很讨厌在自定义 ANT 构建中对构建顺序进行硬编码。我们已经这样做了,这已经是过去了,而且非常可怕。是否有任何构建工具可以轻松管理 OSGi 依赖项,如果不能自动解决它们?是否有任何体面的例子说明如何做到这一点?

澄清:

生成的构建脚本只能通过 Eclipse 使用。它们需要手动运行 Eclipse 的各个部分。我们还有一些 Eclipse 构建没有的标准目标,我不想修改生成的文件,因为我可能会重新生成(我知道我可以做包含,但我想避免所有 Eclipse 生成文件一起)

这是我的项目布局:

/
-PluginA
-PluginB
-PluginC
.
.
.

在使用 Eclipse PDE 时,每个插件都有一个 Manifest,但没有 build.xml,因为 PDE 会为我这样做。很难用 Hudson 自动化一个 gui 驱动的过程。我想设置我自己的 build.xml 来构建每个,但是存在依赖项和构建顺序问题。这些问题是由 Manifest 文件(描述 OSGi 导入)驱动的。例如,PluginC 依赖于 PluginB,而 PluginB 又依赖于 PluginA。它们必须以正确的顺序构建。我意识到我可以手动控制构建顺序,我正在寻找一种工具来帮助自动化构建顺序依赖管理。

【问题讨论】:

为什么声明式服务不起作用? 【参考方案1】:

Maven2一路;有一个名为 m2eclipse 的 Eclipse 插件来帮助管理它,准确地解决了依赖问题,然后解决了一些问题。有一个free online book as documentation。

具体查看multi-module projects 将许多组件捆绑在一起,并让 Maven 计算出构建顺序和依赖关系。

还有一个chapter on the Eclipse integration。

这只是 Eclipse 和 Maven,接下来你会为 OSGi 获得一些很酷的东西:

Apache Felix BND Maven plugin 将自动生成您的清单或至少可以帮助您 PAX OPS4J project 及其 Maven 插件在引导项目、提供启动器等方面有很大帮助

从根本上说,Maven 模块模型与 OSGi 的捆绑模型完美契合。 3 年多来,我们一直在使用 Maven 构建和管理具有数百个捆绑包的多个产品,这非常棒。

【讨论】:

【参考方案2】:

第二个 Maven2。查看用于构建的 Tycho 插件 - 它们使用 Eclipse 的 JDT 编译器,因此它在编译时实现所有 OSGi 规则,就像 Eclipse 在运行时一样。

另外,Apache Felix BND 插件似乎也很受欢迎。我更喜欢 Tycho,因为它似乎更紧密地统一了 Maven 和 Eclipse 开发环境。

【讨论】:

【参考方案3】:

我们使用Buckminster。它是一个构建和组装框架,负责解决依赖关系、从各种存储库中获取、构建和打包产品。

这是一个 Eclipse 工具项目。它与 PDE 很好地集成。

这意味着我们用于构建 RCP 的所有元数据对于 Buckminster 解析和构建都是有用的。例如,Manifest.MF、.product 中的 feature.xml 和 Require-Bundle 标头。

我们现在在每个包中都没有任何构建脚本;我们现在每个产品都有一个构建。 Buckminster 负责遍历依赖关系图。

尽管他们(Buckminster 团队)已经开始使用 Hudson 来托管项目本身,但我们还是需要付出一些努力才能让我们现有的巡航控制/蚂蚁系统与之配合使用。我相信他们的构建设置也可以下载。

我们对它印象深刻,尽管它还处于起步阶段。

我们还研究了Pax-Construct,但我们不想使用 Maven。

我们目前也在关注Spring DM testing framework 以加强单元测试工作。

【讨论】:

【参考方案4】:

结束一些老问题...

由于缺乏网络连接和时间,我们的设置不利于 maven。我知道有离线的 maven 设置,但考虑到时间太多了。希望我们有时间重新组织构建过程时能够使用正确的设置。

解决方案涉及 Ant、BND 和一些自定义的 Ant 任务。各种捆绑依赖项是手动管理的。我们已经在使用 Ant; BND 和自定义任务将它们捆绑在一起。自定义任务只是确保我们的 bnd/eclipse 项目是同步的。

【讨论】:

【参考方案5】:

PDE 无头构建。 Eclipse 对此进行了详细记录。如果您正在构建 Eclipse 插件,并且想通过命令行来完成,那么 Eclipse PDE 无头构建是您的最佳选择。

【讨论】:

【参考方案6】:

您能否详细说明问题发生在哪里?您提到了 OSGi 捆绑包依赖项。这是在运行时吗?还是在编译时?在第一种情况下,您应该考虑声明式服务(请参阅 OSGi 规范)。

【讨论】:

【参考方案7】:

我们使用 Hudson 和 PluginBuilder 来构建我们基于 Eclipse 的 OSGi 包/插件。这建立在 Eclipse 用于构建插件的标准 PDE 过程之上。这意味着使用 Eclipse 作为编译器。

【讨论】:

【参考方案8】:

Maven 不需要互联网连接!看在上帝的份上,请使用 -o 开关。

【讨论】:

【参考方案9】:

我使用 maven 3.0.2

mvn 生成:原型

select 252 - osgi-archetype
mvn idea:idea

见http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html

要将您的依赖项添加到包中,请使用 pom.xml 中的这个简短示例

<Export-Package>org.foo.myproject.api</Export-Package>

<Import-Package>org.foo.myproject.api</Import-Package>

【讨论】:

以上是关于如何管理 OSGi 构建依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

在集成 Maven、Tycho 和 Eclipse 时处理非 OSGi 依赖项

OSGI中的service依赖关系管理

如何部署 OSGi 应用程序和依赖项?

使用不同的启动级别来管理 OSGi 包之间的依赖关系是不是合理?

如何将自定义 osgi 包添加为新依赖项?

OSGI - 处理 3rd 方 JAR 及其依赖项