在同一内容包中嵌入同一 OSGI 依赖项的多个版本
Embedding multiple version of the same OSGI dependency in the same content-package
短版:
如何配置 AEM/CQ5 内容包的 maven POM,以便该包嵌入同一 OSGI 包的不同版本?
长版:
我正在为 AEM (CQ5) 构建内容包。此内容包嵌入了项目所需的直接和间接 osgi 依赖项。
我对其中一个捆绑包(我们称它为 BundleX)有疑问,由于 Google Guava 的特定版本上的未解决的包导入,在内容包部署后它仍然处于未激活状态。 Guava 是我在项目中嵌入的 osgi 依赖项的一部分。问题是不同的bundle依赖不同版本的Guava。
所以我有:
项目内容包:
- 我的包:
- 取决于 Guava:15.0(某些功能我确实需要这个版本)
- BundleX
- 取决于 Guava:r06(r06 < 15.0。我无法控制这个包)
制作我的内容包时,我想嵌入两个 guava 版本。众所周知,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 依赖项。
将bundle2的依赖版本从r06覆盖到15.0,所以我的容器只需要Guava 15.0。由于我无法控制这个包,我应该从外部覆盖它,但我不知道是否可以这样做。
提前,非常感谢您的帮助!
AEM 在后台使用的 Apache Sling OSGi 安装程序不支持安装相同(意味着具有相同 Bundle-SymbolicName
)捆绑包的多个版本。所以仅仅在一个内容包中添加几个版本的包是没有用的,最高的包版本总是获胜而其他的没有安装。
您可以使用标准 OSGi 工具(例如网络控制台)安装多个版本。
一种解决方法是使用您自己的符号名称重新打包一个包(如 "foo.0.15" 用于 V0.15),以便 Sling 安装程序将多个版本视为不同的包并将它们全部安装。
在这两种情况下,这些包在其 Export-Package
语句中具有正确的版本范围,以避免冲突。
短版:
如何配置 AEM/CQ5 内容包的 maven POM,以便该包嵌入同一 OSGI 包的不同版本?
长版:
我正在为 AEM (CQ5) 构建内容包。此内容包嵌入了项目所需的直接和间接 osgi 依赖项。
我对其中一个捆绑包(我们称它为 BundleX)有疑问,由于 Google Guava 的特定版本上的未解决的包导入,在内容包部署后它仍然处于未激活状态。 Guava 是我在项目中嵌入的 osgi 依赖项的一部分。问题是不同的bundle依赖不同版本的Guava。
所以我有:
项目内容包:
- 我的包:
- 取决于 Guava:15.0(某些功能我确实需要这个版本)
- BundleX
- 取决于 Guava:r06(r06 < 15.0。我无法控制这个包)
制作我的内容包时,我想嵌入两个 guava 版本。众所周知,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 依赖项。
将bundle2的依赖版本从r06覆盖到15.0,所以我的容器只需要Guava 15.0。由于我无法控制这个包,我应该从外部覆盖它,但我不知道是否可以这样做。
提前,非常感谢您的帮助!
AEM 在后台使用的 Apache Sling OSGi 安装程序不支持安装相同(意味着具有相同 Bundle-SymbolicName
)捆绑包的多个版本。所以仅仅在一个内容包中添加几个版本的包是没有用的,最高的包版本总是获胜而其他的没有安装。
您可以使用标准 OSGi 工具(例如网络控制台)安装多个版本。
一种解决方法是使用您自己的符号名称重新打包一个包(如 "foo.0.15" 用于 V0.15),以便 Sling 安装程序将多个版本视为不同的包并将它们全部安装。
在这两种情况下,这些包在其 Export-Package
语句中具有正确的版本范围,以避免冲突。