短版:
如何配置AEM/CQ5内容包的maven POM以便包嵌入相同OSGI包的不同版本?
我正在为AEM(CQ5)构建一个内容包。该内容包嵌入了项目所需的直接和间接osgi依赖项。
我有一个bundle(我们称之为BundleX)的问题,因为在特定版本的Google Guava上有一个未解决的包导入,所以在内容包部署后仍然未激活。Guava是我嵌入到项目中的osgi依赖项的一部分。问题是不同的捆绑依赖于不同版本的番石榴。
所以我有:
在制作我的内容包时,我想嵌入两个番石榴版本。我们知道,OSGi支持同时部署的多个版本的包。
到目前为止,在我的AEM内容包pom配置中,我有:
<plugin>
<groupId>com.day.jcr.vault</groupId>
<artifactId>content-package-maven-plugin</artifactId>
<configuration>
<embeddeds combine.children="append">
<embedded>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<target>${cq.slingUrlSuffix}</target>
</embedded>
...
</embeddeds>
...
</configuration>
...
</plugin>
嵌入式依赖项的版本由maven确定,当然对于这个maven项目是唯一的。
所以,综上所述,要按问题解决,我应该:
>
在osgi容器中嵌入多个版本的Guava。我看到的唯一的解决方案是创建另一个人工的内容包pom来上传其他的Guava依赖项。但它远不是最佳的,因为我希望我的主包包含所有嵌入的osgi依赖项。
AEM暗中使用的Apache Sling OSGi安装程序不支持安装同一套件的多个版本(即具有相同的bundle-symbolicName
)。所以仅仅在一个内容包中添加一个捆绑包的几个版本是没有帮助的,最高的捆绑包版本总是赢的,而其他的没有安装。
您可以使用标准OSGi工具安装多个版本,比如WebConsole。
一个解决方法是用自己的符号名重新打包一个包(比如v0.15的“foo.0.15”),这样Sling安装程序就可以将多个版本视为不同的包并全部安装。
在这两种情况下,这些包都必须在其export-package
语句中具有正确的版本范围,以避免冲突。
Maven插件(maven-compiler-plugin: 3.8.1和maven-surefire-plugin: 3.0.0-M3)在运行mvn清洁包时似乎正在下载同一依赖项(plexus-utils)的多个版本,即使我在依赖项中指定了plexus-utils的最新版本。这不会导致任何错误,但3.0.16之前的任何版本的plexus-utils都容易受到命令注入的影响。有没有办法阻止这种情况
以前部署的JDOM的OSGi包究竟是如何解决这些相同的依赖关系的?它们从来没有在捆绑进口包中列出?此外,如果我试图将这些作为项目的依赖项包含并嵌入它们,只会加剧问题。救命啊!
问题内容: 我正在为Java中的ERP系统进行定制。在我的定制中,我想使用Apache POI 3.10.1。因此,我集成了jars poi-3.10.1-20140818.jar和poi-ooxml-3.10.1-20140818.jar。 但是,这些jar包含几个类,这些类已经包含在ERP系统的核心代码中,但是有所不同。 如果核心ERP类覆盖POI类,则定制将引发运行时异常。如果POI类覆盖核
问题内容: 我刚刚遇到了一个案例,即我的Maven项目有两个直接依赖项,其中有两个不同版本的特定传递性依赖项。 在我的特殊情况下,我直接依赖以下内容: 和 这两个依赖项都对com.sun.jersey:jersey- core具有(较深)的传递性依赖关系,但是每个都有不同的版本。Maven并没有失败,甚至没有警告(或者,如果没有,我从来没有看到过!)正在发生这样的事情……因此,直到调试了球衣版本时
根据Maven文档,将使用依赖项中介来决定使用哪个依赖项: 因此,假设我们首先声明依赖项,那么1.0版将在我们的应用程序中使用。这意味着依赖项将在运行时使用1.0版,而as是根据2.0版编译的。如果使用的是2.0版的一些特性,那么我们将会得到一个运行时错误(,等),这是不好的。 因此要“修复”这一点,我们可以从依赖项中排除依赖项,从而使用2.0版本。但是哦不!2.0版不向后兼容,因此我们最终会从得