Java OSGI架构和Maven多模块项目之间的区别是什么?

Java OSGI架构和Maven多模块项目之间的区别是什么?,java,maven,osgi,apache-felix,Java,Maven,Osgi,Apache Felix,我试图理解OSGI,正如它所说的定义 OSGi技术是一组定义动态 Java组件系统。这些规范使开发成为可能 一个应用程序由多个组件组成的模型,这些组件是 成捆包装。组件在本地和跨网络进行通信 通过服务建立网络 但我在这里感到困惑,因为同样的动态模块创建也可以通过Maven多模块项目结构完成。因此,我的问题是OSGI架构与Maven多模块项目有何不同。Maven和OSGI之间的主要区别在于模块之间如何相互依赖 在maven中,模块依赖于其他maven模块的列表。这是一个简单的模型,但通常会导致可传

我试图理解OSGI,正如它所说的定义

OSGi技术是一组定义动态 Java组件系统。这些规范使开发成为可能 一个应用程序由多个组件组成的模型,这些组件是 成捆包装。组件在本地和跨网络进行通信 通过服务建立网络


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

Maven和OSGI之间的主要区别在于模块之间如何相互依赖

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

在OSGi中,依赖关系表示为需求和功能。然后在应用程序的组装时使用OSGi解析器来查找满足一组初始需求的候选捆绑包(存储库)的闭包。最常见的是,这些初始需求是您的顶级用户包。然后,解析器在解决需求的包上确定一个闭包。因此,显而易见的优势是,当使用解析器时,您对运行的包集将实际工作有很高的信心。在纯java中,您只需将一些JAR一起运行,并希望得到最好的结果

最常见的需求是版本范围内的包。另一个捆绑包可以提供合适版本的软件包。然后,它是冲突解决程序的候选

幸运的是,在构建时,从maven构建创建捆绑包很容易。您可以使用bnd maven插件或maven bundle插件。它通常自行确定需求和能力

在OSGi中,您总是尝试根据API(API JAR)而不是运行时JAR进行开发。这使您的代码更加松散耦合

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


例如,请参见。它展示了如何创建各个bundle以及如何将它们组装到正在运行的应用程序中。另请参见。

OSGi是运行时,而多模块是构建时…以及组织代码和模块。@khmarbaise,感谢您的回复。这是否意味着,如果我创建一个简单的maven多模块项目,并创建其捆绑包并在Apache Felix中部署,它是否仍然遵循OSGI,或者我需要在我的项目结构中做一些特殊的事情?当然,您需要确保您的捆绑包定义等是正确的,并且您的依赖关系是正确的(需要查看Felix部分)特别是与基于MANIFEST.MF的依赖项相关?…感谢Christian,非常好的解释。顺便说一句,为了理解OSGi,我正在学习你们的Karaf教程。谢谢这些很棒的教程。