OSGI Architecture 和 Maven 多模块项目有什么区别?

What is the difference between OSGI Architecture and Maven multi module project?

我正在尝试理解 OSGI,按照它的定义

OSGi technology is a set of specifications that define a dynamic component system for Java. These specifications enable a development model where an application is composed of several components which are packaged in bundles. Components communicate locally and across the network through services.

但我在这里感到困惑,因为同样的动态模块创建也可以使用 Maven 多模块项目结构来完成。所以我的问题是 OSGI 架构与 Maven 多模块项目有何不同。

maven 和 OSGi 之间的主要区别在于模块如何相互依赖。

在 maven 中,一个模块依赖于其他 maven 模块的列表。这是一个简单的模型,但通常会导致传递依赖性出现问题。如果相同的模块出现在不同版本的依赖树中,maven 会简单地选择最高版本。这是一个很好的猜测,但并不总是有效。另一种典型情况是有两个模块具有相同的包但名称不同(拆分包)。

在 OSGi 中,依赖项表示为要求和功能。然后,在您的应用程序的组装时使用 OSGi 解析器来查找满足一组初始要求的候选包(存储库)的闭包。最常见的是,这些初始需求是您的顶级用户包。解析器然后确定解决需求的包的闭包。因此,显而易见的优势是,当使用解析器时,您可以高度相信您 运行 的捆绑包集将实际工作。在简单的 java 中,您只需 运行 将一些罐子放在一起并希望最好。

最常见的要求是针对某个版本范围内的包。另一个捆绑包可能会提供合适版本的包。然后它是解析器的候选者。

幸运的是,在构建时从 maven 构建创建包很容易。您使用 bnd-maven-plugin 或 maven-bundle-plugin。它通常会自行确定要求和功能。

在 OSGi 中,您总是尝试针对 APIs(API-jars)而不是 运行time jar 进行开发。这会使您的代码更加松散耦合。

在 OSGi 中的组装时,您需要提供一组捆绑包来形成解析器要处理的存储库。这通常是使用 pom 完成的。所以实际上这与普通的 maven 并没有太大的不同。主要区别在于,解析器为您提供了一组最小的验证包 运行,而典型的 mavne 构建只为您提供了一组表示所有传递依赖项的 jar。

例如,请参阅 new enroute microservice example. It shows how to create the individual bundles and how to assemble them into a running application. See also the tutorial for the example