java - AEM OSGI 3rd 方依赖项, bundle 未激活

标签 java maven osgi aem

我正在处理一个 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/

相关文章:

java - 如何在地址为46.XX.XX.XX :8008/的页面中下载java小程序类文件

java - Java float 的尾数部分的最大数字是多少?

java - 如何在 Spring JDBC ResultSetExtractor 中检查 ResultSet 是否为空?

linux - 无法通过使用 Maven 和 Linux 的分布式 JMeter 设置将参数传递给从站

java - PAX-CDI : how to get reference to BeanManager in bundle without using CDI

java - Jackson 序列化 null 或空对象

java - 两个 Maven 项目中的相同包、相同类(WAR 和 JAR)、类路径问题

java - 将 Quarkus 应用于非 Maven、非 Gradle Java 项目

java - 在 Eclipse 中安装插件要求我重新启动 Eclipse

osgi - OSGi 包中的 Java Web 应用程序过滤器的等价物是什么?