为啥即使我的 maven 依赖项中有第三方依赖项,也只需要 OSGi 容器中的第三方依赖项?

Posted

技术标签:

【中文标题】为啥即使我的 maven 依赖项中有第三方依赖项,也只需要 OSGi 容器中的第三方依赖项?【英文标题】:Why third party dependency is required exclusively from OSGi container even if I have it in my maven dependencies?为什么即使我的 maven 依赖项中有第三方依赖项,也只需要 OSGi 容器中的第三方依赖项? 【发布时间】:2018-12-09 15:14:12 【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

如果有人能解释为什么我的问题被否决了。下次提问时我会小心的。 “我想知道为什么 OSGi 不尊重 maven 依赖项”不是一个好的开始。为什么不问为什么 Maven 不尊重 OSGi 依赖项? ;-) 如果有帮助,OSGi 也不尊重 gradle、ant 或 sbt 依赖项。 【参考方案1】:

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

Maven 只是编译你的代码。

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

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

【讨论】:

【参考方案2】:

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

我希望这会有所帮助!

【讨论】:

正如这个答案中提到的并得到其他作者的支持,我们应该在容器中单独部署我们的 OSGi 包。将它与我的项目一起运送并不是一个好习惯。 ***.com/questions/1340483/… 确实...我不推荐的原因是在每个环境中单独部署捆绑软件会产生开销,并且还需要为开发人员设置本地环境的额外步骤。 是的,这是一个开销..谢谢你的提及! :)

以上是关于为啥即使我的 maven 依赖项中有第三方依赖项,也只需要 OSGi 容器中的第三方依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

当我们在 Eclipse 插件依赖项中有 `Required Plug-ins` 时,为啥我们需要 `Imported Packages`?

可以使Maven构建包含依赖项中的.class文件[重复]

在 Maven 依赖项中添加 pubnub 后 Spring Boot 应用程序无法启动

在 Maven 依赖项中定位资源的 URI 方案?

maven依赖项中类型“bundle”的含义是啥?

Prisma 易受攻击的依赖项未在 Maven 依赖项中显示:树