在同一内容包中嵌入相同OSGI依赖项的多个版本

时间:2015-09-02 17:02:30

标签: maven osgi cq5 aem

简短版:

如何配置AEM / CQ5内容包的maven POM,以便包嵌入相同OSGI包的不同版本?

长版:

我正在为AEM(CQ5)构建内容包。此内容包嵌入了项目所需的直接和间接osgi依赖项。

我遇到了其中一个捆绑包(让他们称之为BundleX)的问题,因为在特定版本的Google Guava上导致未解析的包导入,因此在部署内容包后仍然无法使用该捆绑包。 Guava是我嵌入项目的osgi依赖项的一部分。问题是不同的bundle依赖于不同版本的Guava。

所以我有:

项目内容包:

  • MyBundle:
    • 取决于Guava:15.0(我确实需要此版本的某些功能)
  • BundleX
    • 取决于番石榴:r06(r06 <15.0。我无法控制此捆绑包)

在制作我的内容包时,我想嵌入两个番石榴版本。我们知道,OSGi支持同时部署的多个版本的软件包。

到目前为止,在我的AEM内容包pom配置中,我有:

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

嵌入式依赖项的版本由maven决定,当然对于这个maven项目也是唯一的。

所以,总而言之,要解决问题,我应该:

  • 在osgi容器中嵌入了多个版本的Guava。我看到的唯一解决方案是创建另一个人工内容包pom,以便上传其他Guava依赖项。但由于我希望我的主程序包包含所有嵌入的osgi依赖项,因此它是最佳选择。

  • 将bundle2的依赖版本从r06覆盖到15.0,所以我的容器中只需要Guava 15.0。由于我无法控制此捆绑,我应该从外部覆盖,但我不知道是否可以这样做。

事先,非常感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

AEM使用的Apache Sling OSGi安装程序不支持安装相同的多个版本(意味着具有相同的Bundle-SymbolicName)捆绑包。因此,只需在内容包中添加多个版本的捆绑包即可获得帮助,最高捆绑版本总是会赢,而其他版本则不会安装。

您可以使用标准OSGi工具安装多个版本,例如web控制台。

解决方法是使用您自己的符号名称重新打包捆绑包(例如&#34; foo.0.15&#34;对于V0.15),以便Sling安装程序将多个版本视为不同的捆绑包并将它们全部安装。

在这两种情况下,这些捆绑包在Export-Package语句中具有正确的版本范围,以避免冲突。