为什么第三方依赖只需要来自OSGi容器,即使我的maven依赖中也有它?



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

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

我用aem原型创建了maven项目。

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

但是当我去 felix 控制台中查看我的捆绑包时,我看到它不是活动状态,而是处于已安装状态。报告的错误是它无法解析javax.persistence包。 我很困惑,我搜索并在这里读到它——

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

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

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

也许这是由于任何架构上的好处,但是谁能在这里解释一下OSGi的这种行为?为什么/如何OSGi的这个功能是有用的?

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

Maven只是编译你的代码。

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

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

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

我希望这有帮助!

最新更新