我正在研究AEM项目,我是AEM的新手。我正在尝试使用两个第三方非OSGI库,例如Dozer和Spring。我真的为此感到挣扎,这很痛苦,也许是因为OSGI有点老派了。我的捆绑软件安装完毕,但由于抱怨缺少软件包而在OSGI控制台中未激活。
我想一步一步地做。首先,我只想使用推土机而不是其他任何东西来使我的捆绑包工作。这是我的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
休眠依赖项错误是新的。我以为beanutils依赖于休眠,但不是,Dozer是依赖它的。
我尝试添加休眠,如下所示:
<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时,与第三方库一起工作的最佳方法是什么?就我而言,Maven正在将捆绑软件安装在我的AEM实例中。
答案 0 :(得分:1)
在OSGi中,您必须区分构建和运行时。在构建时,您最初的方法是完全可以的。
您使用推土机,并且maven-bundle-plugin创建合适的Import-Package语句。您可以查看罐子的清单来检查这些内容。 程序包导入规则产生了一系列应与您的代码一起使用的版本。因此[5.5,6)正是预期的进口范围。
现在运行。在这里,您必须在AEM中(或更常见的是在OSGi运行时中)以捆绑形式提供代码的所有依赖项(包括可传递的依赖项)。 因此,您还需要捆绑安装推土机OSGi。如果再次抱怨,则还需要安装其依赖项。
这是默认方法,通常完全可以。
现在,如果要使捆绑包独立于没有其他运行时依赖关系,则可以尝试嵌入所有依赖项。然后,您只需要安装软件包即可。
请注意,这并不容易。如果您的代码在其自己的API中使用了某些嵌入式类,则嵌入会遇到很多问题。因此,如果您不是非常有经验,那么最好采用将所有依赖项捆绑安装的方式。
为简化安装过程,您可以创建一个内容包,其中包含所有必需的捆绑软件。
您还必须检查所有依赖项是否实际上都是捆绑包。在某些情况下,一般的maven依赖关系不合适。在这种情况下,请查看apache servicemix捆绑包。这是一个为常见的依赖项创建OSGi捆绑并将其部署到Maven Central的项目。