为什么即使我在maven依赖项中也需要OSGi容器专门提供第三方依赖项?

时间:2018-06-30 20:58:30

标签: maven jpa osgi osgi-bundle apache-aries

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

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

我创建了具有aem原型的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的功能有用?

2 个答案:

答案 0 :(得分:3)

Maven POM的user www-data部分仅涉及您的编译时间依赖项。这意味着当您运行Maven来构建项目时,这些依赖项将用于编译源代码并构建 your 包。 Maven本身不知道AEM或OSGi或任何其他平台或框架(例如Spring)。

Maven只是编译您的代码。

作为开发人员,您有责任在 runtime 中获得所有必需的编译时间依赖项。

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

答案 1 :(得分:0)

原因是:作为依赖项添加的内容已添加到项目的构建路径中,并且可用于您的类。当您运行mvn install时,它将检查所有依赖项的存在并为您创建一个bundle / jar。默认情况下,此捆绑包仅包含您的项目类,而没有其他依赖项。 您需要在depfinder中检查OSGi容器中是否已经存在外部依赖关系,否则,您可以通过使用pom.xml中存在的maven-bundle-plugin将外部依赖关系嵌入到您的软件包中来将它们加载到OSGi容器中,或者通过制作一捆jar文件(我不建议这样做)。

我希望这会有所帮助!