我正在处理一个 AEM 项目,顺便说一句,我是 AEM 新手。我正在尝试使用一些第三方非 OSGI 库,例如 Dozer 和 Spring。我真的很挣扎,这很痛苦,也许是因为 OSGI 有点老派。我的包已安装,但在 OSGI 控制台中未处于 Activity 状态,因为它们提示缺少包。
我想一步一步做。首先,我想只用 Dozer 来完成我的包的工作,而不用其他任何东西。这是我的 pom 依赖项:
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer-osgi</artifactId>
<version>5.5.1</version>
</dependency>
这是我的 maven-bundle-plugin 配置:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<version>4.1.0</version>
<configuration>
<instructions>
<Export-Package>somepackages*</Export-Package>
<Private-Package/>
<Import-Package>*</Import-Package>
<Sling-Bundle-Resources>/META-INF</Sling-Bundle-Resources>
</instructions>
</configuration>
</plugin>
如您所见,我已经在使用 dozer-osgi 了。我不知道为什么它不接受它。它提示这一点:
org.dozer,version=[5.5,6) -- Cannot be resolved
org.dozer.loader.api,version=[5.5,6) -- Cannot be resolved
首先,我不明白为什么它说[5.5,6),因为我告诉它使用5.5.1。其次,我已经在使用 dozer-osgi,我相信它应该会自动选择它。
我也尝试使用:
<Embed-Dependency>dozer-osgi</Embed-Dependency>
添加了 dozer-osgi 后,事情开始变得更好,同时也变得更加复杂。看起来现在它加载了推土机,但开始提示传递依赖:
android.dalvik -- Cannot be resolved
dalvik.system -- Cannot be resolved
javassist.util.proxy -- Cannot be resolved
org.apache.commons.beanutils,version=[1.9,2) -- Cannot be resolved
org.apache.commons.beanutils.converters,version=[1.9,2) -- Cannot be resolved
beanutils utils 很容易修复。我只需要添加相关的依赖项,如下所示:
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
并在此处添加“commons-beanutils”:
<Embed-Dependency>dozer-osgi,commons-beanutils</Embed-Dependency>
现在,它提示:
android.dalvik -- Cannot be resolved
dalvik.system -- Cannot be resolved
javassist.util.proxy -- Cannot be resolved
org.hibernate.proxy -- Cannot be resolved
hibernate 依赖错误是新的。我以为beanutils依赖于hibernate,但是不是,Dozer是依赖于它的吗?
我尝试添加 hibernate ,如下所示:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.9.Final</version>
</dependency>
<Embed-Dependency>dozer-osgi,commons-beanutils,hibernate-core</Embed-Dependency>
等等,就像一个样子,每次我尝试添加传递依赖时,情况都会变得越来越糟。我也尝试过这个,只将 dozer-osgi 保留在我的依赖项中:
<Embed-Dependency>dozer-osgi</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
结果:
android.dalvik -- Cannot be resolved
dalvik.system -- Cannot be resolved
javassist.util.proxy -- Cannot be resolved
org.hibernate.proxy -- Cannot be resolved
org.apache.commons.beanutils -- Cannot be resolved
org.apache.commons.beanutils.converters -- Cannot be resolved
这就好像 Embed-Transitive 根本不起作用一样。
使用 Maven 和 AEM 时使用第 3 方库的最佳方式是什么?就我而言,Maven 用于在我的 AEM 实例中安装 bundle 。
最佳答案
在 OSGi 中,您必须区分构建和运行时。在构建时,您最初的方法完全没问题。
您使用推土机,并且 maven-bundle-plugin 创建合适的 Import-Package 语句。您可以通过查看 jar 的 list 来检查这些。 包导入的规则会产生一系列适用于您的代码的版本。因此 [5.5,6) 正是预期的导入范围。
现在到运行时了。在这里,您必须将代码的所有依赖项(包括传递依赖项)作为 AEM 中的 bundle 提供(或更普遍地在 OSGi 运行时中)。 因此,您还需要将 dozer OSGi 作为 bundle 安装。如果再次出现此问题,那么您还需要安装其依赖项。
这是默认方法,通常完全没问题。
现在,如果您想让您的 bundle 独立于没有额外的运行时依赖项,那么您可以尝试嵌入所有依赖项。然后你只需要安装你的 bundle 。
请注意,这并不容易。如果您的代码在其自己的 API 中使用某些嵌入类,那么您会遇到很多嵌入问题。因此,如果您经验不足,那么最好将所有依赖项安装为 bundle 。
为了简化安装过程,您可以创建一个包含所有所需 bundle 的内容包。
您还必须检查所有依赖项实际上都是 bundle 。在某些情况下,普通的 Maven 依赖项并不适用。在这种情况下,请查看 apache servicemix bundle 。它是一个为流行依赖项创建 OSGi bundle 并将其部署到 Maven 中心的项目。
关于java - AEM OSGI 3rd 方依赖项, bundle 未激活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56080054/