我试图按照其定义理解OSGI
OSGi技术是定义动态的一组规范 Java组件系统。这些规范有助于开发 应用程序由几个组件组成的模型 打包包装。组件在本地和跨 通过服务网络。
但是我在这里感到困惑,因为使用Maven多模块项目结构也可以完成相同的动态模块创建。所以我的问题是OSGI架构与Maven多模块项目有何不同。
答案 0 :(得分:2)
maven与OSGi之间的主要区别在于模块之间的相互依赖方式。
在Maven中,一个模块取决于其他Maven模块的列表。这是一个简单的模型,但通常会导致传递依存关系方面的问题。如果相同的模块出现在具有不同版本的依赖关系树中,则maven只会选择最高版本。这是一个很好的猜测,但并不总是有效。另一个典型的情况是,两个模块具有相同的程序包,但名称不同(拆分的程序包)。
在OSGi中,依赖性表示为需求和功能。然后,在应用程序组装时使用OSGi解析器在满足一组初始要求的候选包(存储库)上查找闭包。这些初始需求最常见的是您的顶级用户捆绑包。然后,解析程序确定对束的闭合以解决需求。因此,明显的优势在于,在使用解析器时,您可以高度确信您运行的捆绑包确实可以工作。在普通的Java中,您只需一起运行一些jar并希望达到最佳效果。
最常见的要求是版本范围内的软件包。另一个捆绑包可能会提供合适版本的包装。然后它将是解析器的候选者。
幸运的是,在构建时从maven构建中创建捆绑包很容易。您可以使用bnd-maven-plugin或maven-bundle-plugin。通常,它自己计算出需求和功能。
在OSGi中,您总是尝试针对API(API罐)而不是运行时jar进行开发。这使您的代码更加松散地耦合。
在OSGi中进行组装时,您需要提供一组捆绑软件以形成用于解析程序的存储库。这通常是使用pom完成的。因此,实际上这与普通行家并没有太大区别。主要区别在于,解析程序为您提供了一组可运行的验证包,而典型的mavne构建只是为您提供了一组代表所有传递依赖项的jar。
例如,请参见new enroute microservice example。它显示了如何创建单个捆绑包以及如何将它们组装到正在运行的应用程序中。另请参见tutorial for the example。