AEM OSGI第三方依赖性,捆绑包未激活

时间:2019-05-10 14:51:50

标签: java maven osgi aem

我正在研究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实例中。

1 个答案:

答案 0 :(得分:1)

在OSGi中,您必须区分构建和运行时。在构建时,您最初的方法是完全可以的。

您使用推土机,并且maven-bundle-plugin创建合适的Import-Package语句。您可以查看罐子的清单来检查这些内容。 程序包导入规则产生了一系列应与您的代码一起使用的版本。因此[5.5,6)正是预期的进口范围。

现在运行。在这里,您必须在AEM中(或更常见的是在OSGi运行时中)以捆绑形式提供代码的所有依赖项(包括可传递的依赖项)。 因此,您还需要捆绑安装推土机OSGi。如果再次抱怨,则还需要安装其依赖项。

这是默认方法,通常完全可以。

现在,如果要使捆绑包独立于没有其他运行时依赖关系,则可以尝试嵌入所有依赖项。然后,您只需要安装软件包即可。

请注意,这并不容易。如果您的代码在其自己的API中使用了某些嵌入式类,则嵌入会遇到很多问题。因此,如果您不是非常有经验,那么最好采用将所有依赖项捆绑安装的方式。

为简化安装过程,您可以创建一个内容包,其中包含所有必需的捆绑软件。

您还必须检查所有依赖项是否实际上都是捆绑包。在某些情况下,一般的maven依赖关系不合适。在这种情况下,请查看apache servicemix捆绑包。这是一个为常见的依赖项创建OSGi捆绑并将其部署到Maven Central的项目。