如何从 OSGi 开始

How to start with OSGi

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

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

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

非常感谢您!

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

update To address this question better, I've written a booklet & videos that allows you to get inside OSGi quickly. It is very interactive, using Bndtools and the OSGi Gogo shell. You can find it here.

updated text for readability & current state

我能理解这种困惑……现在有大量的构建工具,它们都支持 OSGi。由于您有时需要工具组合,因此 space 很复杂。

bnd

要使用 OSGi,您需要构建 bundle。一个bundle是一个JAR文件,默认格式为Javalibraries/executables。当 JAR 文件中的 manifest 包含 OSGi metadata 时,它们是捆绑包。此元数据向工具和 OSGi 框架提供信息,它 需要 来自运行时的功能以及它 提供 给运行时的功能。此信息用于 assemble 运行时以及在运行时验证事物是否兼容。

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

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

IDE & 持续集成

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

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

型号

仅限 Maven

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

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

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

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

Gradle 仅

虽然 Gradle 也依赖插件来完成所有低级工作,但它严重依赖 Groovy 来提供构建操作。

bndtools 组提供了一个插件,使在正常 Java 构建中生成 OSGi 元数据变得微不足道:

在此模型中,所有依赖项必须存储在 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模型。在此模型中,workspace 是一个包含 OSGi 捆绑项目的目录,一个特殊目录 (cnf) 包含 workspace 范围的信息。所有构建信息都存储在 bnd 文件中,这些文件是很好的旧 Java 属性 文件。

Eclipse/Bndtools 和 Gradle(还有 Ant!)有插件可以读取工作 space 和项目目录中的信息,并教导它们各自的构建工具源代码所在的位置是,二进制文件应该存储在哪里等等。这些使用 bnd 的工具的插件会尽力确保构建结果相同。

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

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

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

从哪里开始?

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

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

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