-2

我想知道为什么 OSGi 不尊重 maven 依赖。

我想在 OSGi(AEM) 中创建一个应用程序。我想在 JPA(eclipselink)的帮助下与数据库进行通信(CRUD)。

我用 aem-archetype 创建了 maven 项目。

将所有必需的依赖项(JPA)添加到我的 maven 项目的 pom 文件中。Eclipse 中没有错误,我通过构建项目mvn clean install并将其安装到 AEM(CQ5) 中mvn sling:install。到目前为止一切都很好。没有错误。

但是当我在 felix 控制台中查看我的包时,我看到它不是Active而是处于Installed状态。报告的错误是它无法解析javax.persistence包。我很困惑,我搜索并在这里阅读了它 -

您必须确保将相同版本放在另一个捆绑包中并首先部署。 https://forums.adobe.com/thread/2325007

我将 JPA jar 转换为 OSGi 包并安装在我的 OSGi 容器中,错误消失了。伟大的!

但是为什么 OSGi 不注意我在我的 maven 项目的 pom.xml 中编写的依赖项。为什么它需要严格来自 OSGi 包的 JPA?

也许这是由于任何架构上的好处,但是有人可以在这里向我解释一下 OSGi 的这种行为吗?OSGi 的这个特性为什么/如何有用?

4

2 回答 2

3

您的<dependency>Maven POM 部分仅涵盖您的编译时依赖项。这意味着当您运行 Maven 来构建您的项目时,这些依赖项用于编译源代码并构建您的包。Maven 本身不知道 AEM 或 OSGi 或任何其他平台或框架(例如 Spring)。

Maven 只是编译你的代码。

作为开发人员,您有责任确保所有必需的编译时依赖项在运行时也可用。

我们通常做的是创建一个 AEM 内容包 Maven 模块,并将我们所需的所有第三方依赖项(例如 JPA 包)放入其中。然后由 Maven 部署此内容包,以便这些依赖项在运行时也可用。

于 2018-07-01T02:31:42.240 回答
0

原因是:您作为依赖项添加的内容将添加到项目的构建路径中并且可用于您的类。当您运行 mvn install 时,它会检查所有依赖项的存在并为您创建一个包/jar。默认情况下,此包只有您的项目类没有其他依赖项。您需要在 depfinder 中检查 OSGi 容器中是否已经存在外部依赖项,如果没有,则必须通过在 pom.xml 中存在的 maven-bundle-plugin 的帮助下将外部依赖项嵌入到包中或通过将它们加载到 OSGi 容器中制作你已经完成的一束 jar 文件(我不会推荐)。

我希望这有帮助!

于 2018-07-01T16:37:07.987 回答