如何开始使用 OSGi

Posted

技术标签:

【中文标题】如何开始使用 OSGi【英文标题】:How to start with OSGi 【发布时间】:2019-03-17 11:45:40 【问题描述】:

在我工作的地方,他们要求我学习 OSGi 框架并决定使用它的最佳方法。

在过去的两周里,我在网上冲浪,发现了许多使用 OSGi 的不同方法,例如,我发现了 OSGi enRoute 方法和一个名为 BndTools 的 Eclipse 插件。我发现我可以简单地使用声明式服务或 AIOLOS 之类的框架。

我对所有这些不同的方法和技术有点困惑……您认为对于初学者来说,开始使用 OSGi 的最佳方法是什么?是否有比其他实现更好的实现(例如 Equinox)?您有使用此框架的首选方法吗?

非常感谢您!

【问题讨论】:

这可能有助于在 Eclipse/Tycho 和 Bnd 方法之间进行选择:***.com/questions/11373009 【参考方案1】:

从 OSGi enRoute 开始。它将讨论使用 Bndtools 作为 IDE。它已经使用 Bnd maven 插件来构建包,并演示了使用声明式服务来编码提供和使用服务。

【讨论】:

作为参考,OSGi enRoute 项目和教程可在enroute.osgi.org获得【参考方案2】:

更新 为了更好地解决这个问题,我编写了一本小册子和视频,让您可以快速了解 OSGi。它是非常交互式的,使用 Bndtools 和 OSGi Gogo shell。你可以找到它here。

更新文本以提高可读性和当前状态

我能理解其中的困惑......现在有大量的构建工具,而且它们现在都支持 OSGi。由于您有时需要组合工具,因此空间很复杂。

bnd

要使用 OSGi,您需要构建 bundles。包是一个 JAR 文件,是 Java 库/可执行文件的默认格式。当 JAR 文件中的 manifest 包含 OSGi 元数据 时,它们是捆绑包。此元数据向工具和 OSGi 框架提供信息,它需要运行时提供哪些功能,以及它提供运行时哪些功能。此信息用于组装运行时以及在运行时验证事物是否兼容。

手动维护这些信息是一项令人作呕的工作。出于这个原因,bnd 是我在大约 19 年前开发的。 bnd 是目前业界创建此元数据、简化元数据装饰和验证元数据有效性的主要库。它对捆绑包进行广泛的分析和注释,以最大限度地减少手动工作。

在 bnd 情况下,它还支持用于声明式服务、清单注释等的 OSGi 标准构建注释。 (许多 OSGi 标准起源于 bnd。)

IDE 和持续集成

IDE 是读取、编写和调试代码的首选工具。但是,如果没有在远程服务器上运行的持续集成解决方案,您将无法依赖结果,因为您的 IDE 可能依赖于您仅在笔记本电脑上拥有的信息。因此,对于专业开发而言,必须有一些服务器可以在不使用缓存的情况下从头开始构建您的软件。

显然,当您在笔记本电脑上开发软件时,与在服务器上构建时的结果相同,这一点至关重要。出于这个原因,bnd 提供了一个可以在 IDE 和不同构建工具中使用的库。尽管可以使用 bnd 的组合有无数种,但最受欢迎的组合却很少。

型号

仅限 Maven

Maven 是一种流行的 Java 应用程序构建工具。它定义了 POM(项目对象模型)文件中的所有构建信息,这些文件是 XML 文件。 POM 可以从其他 POM 继承。每个 POM(和工件)由 group id、artifact id 和不透明版本标识。 Maven 有一个相当固定的项目结构。所有构建工作都是通过从 POM 获取配置的插件完成的。

有两个基于 bnd 的 Maven 插件,它们提供必要的 OSGi 元数据生成。

Apache Felix Maven Plugin Bnd Maven Plugins

在此模型中,bnd 仅用于提供包中的元数据。所有依赖项必须在 Maven 存储库中。

还有第三个插件 Tycho,它使用 Eclipse PDE 模型构建包。我听说今天很少有人推荐使用 PDE/Tycho,这并不是一个轻松的开发,许多 PDE 用户正在寻找替代方案。这个插件必须弥合 PDE 和 Maven 之间的巨大语义鸿沟。

仅分级

虽然 Gradle 还依赖插件来完成所有低级工作,但它在很大程度上依赖于 Groovy 来提供构建操作。

bndtools 组提供了一个插件,可以轻松地在普通 Java 构建中生成 OSGi 元数据:

bnd Gradle plugin

在此模型中,所有依赖项都必须存储在 Gradle 可访问的存储库中,这些存储库通常是 Maven 存储库。

Eclipse、M2E、Maven 和 Bndtools

在这个四重奏中,Eclipse 是基本的 IDE,M2E 是一个插件,它教 Eclipse 如何根据 maven 规范(pom 文件)构建包。在这个四重奏中,bnd 作为插件在 Maven 中运行。 Bndtools 提供了一些 M2E 所缺乏的额外 OSGi IDE 功能。这主要集中在为 OSGi 运行时创建程序集和查看包。

在此模型中,所有构建信息都存储在 Maven POM 中。这是 BJ Hargrave 在此问题的另一个答案中发布的模型。

在此模型中,bnd 仅用于提供包中的元数据。所有依赖项必须在 Maven 存储库中。

Eclipse、Bndtools、Gradle

另一个专门为 OSGi/bnd 开发的模型是 bnd workspace 模型。在这个模型中,工作空间是一个包含 OSGi 捆绑项目的目录,一个特殊的目录 (cnf) 保存工作空间范围的信息。所有构建信息都存储在 bnd 文件中,这些文件是很好的旧 Java 属性文件。

Eclipse/Bndtools 和 Gradle(以及 Ant!)都有插件,可以读取工作空间和项目目录中的信息,并教他们各自的构建工具源在哪里,二进制文件应该存储在哪里等。插件这些使用 bnd 的工具会竭尽全力确保构建结果相同。

原来的archived OSGi enRoute 就是基于这个模型。尽管已存档,但它仍然是 Bndtools 的主要模型,并被许多公司使用。在 EclipseCon 2018 上有几个关于这个模型的演讲:

How OSGi drives cross-sector energy management – 完全基于 v2Archive OSGi enRoute 模型 How we used OSGi to build open liberty – 使用 Bndtools 和 Gradle 构建 Migrating from PDE to Bndtools in Practice – 最近从 PDE(原始 Eclipse 包构建模型)迁移到 Bndtools

这也是 OSGi 自己用来构建规范 JAR、参考实现和合规性测试套件的模型。

bnd 工作区模型是唯一支持所有存储库标准的模型。这包括 Maven 存储库(Maven Central!)、OSGi 存储库标准、Eclipse P2 存储库、基于目录的存储库,甚至是基于 POM 的存储库。 bnd 工作区模型中对外部存储库的支持非常灵活。

从哪里开始?

通常,从 OSGi 开始的开发人员已经具备 Java 经验。这通常会促使他们选择工具,因为已经有一个遗留物。

如果您可以从零开始,那么我个人的偏好是 bnd 工作区模型。它将优先级放在 IDE 上,这是您花费大部分时间的地方,同时对持续集成构建具有极高的保真度。在过去的 2 年中,我帮助了两家公司,一家从头开始使用 OSGi,另一家拥有 8 年的 PDE 经验。两者现在都基于这种工作空间模型,我对他们如何能够以前所未有的速度在没有任何经验的情况下获得 OSGi 的好处印象深刻。

可以找到使用 Bndtools 和 OSGi Gogo shell 的交互式教程here。有视频!

【讨论】:

以上是关于如何开始使用 OSGi的主要内容,如果未能解决你的问题,请参考以下文章

OSGI中blueprint简介

OSGI容器中的Scala?

如何正确启动和关闭 OSGi 容器?

基于OSGi的Virgo环境搭建——环境篇

比较 OSGi 测试框架

OSGI传统注册式服务与声明式服务