【问题标题】:"cannot be resolved to a type" error after adding depenency in aem project在 aem 项目中添加依赖项后出现“无法解析为类型”错误
【发布时间】:2021-08-26 08:45:57
【问题描述】:

我在我的 AEM 项目中添加了 Jsoup 依赖项。之后,当我在注入 MySlingModel 的 OSGI 服务类中使用 Jsoup 时,我收到错误“com.project.core.models.MySlingModel 无法解析为类型”。

【问题讨论】:

  • 如果您的捆绑包无法启动(在 /system/console/bundles 下检查),或者无法注入所需的依赖项(然后将其设为 @Optional),则会出现此错误。我想,这是第一个。
  • 你说得对,我的包已“安装”,但我不明白为什么。我检查了这个网站和谷歌,并没有找到可以解决我的问题的解决方案。我的包里有这个:org.jsoup,version=[1.14,2) -- Cannot be resolvedorg.jsoup.nodes,version=[1.14,2) -- Cannot be resolved
  • 那么你还没有在你的包中嵌入jsoup。您刚刚添加了依赖项,现在 OSGi 容器无法解析该依赖项。如何将 JAR 嵌入到包中是非常高级的 maven 和 OSGi 东西。不幸的是,我们无法从这里帮助您。这在很大程度上取决于您当前的 maven-build 以及您使用的插件。请尝试从某人那里获得帮助,以扩展您的 pom.xml。
  • 在帮助下,我指的是现场专家。即使是对您当前的 Maven 设置有经验的人也可能需要 30-60 分钟才能完成这项工作、对其进行测试等。
  • 我刚刚查了一下。看来,jsoup 已经打包为 OSGi 包。所以你可以把它放到一个安装文件夹中,例如/apps/myproject/install 。你可以将它嵌入到一个包中。看这里的例子:github.com/alberndt/aem-app-integration/blob/…

标签: maven dependency-injection aem


【解决方案1】:

maven中有6个dependency scopes。通常,AEM 中的所有 Maven 依赖项都包含在 <scope>provided</scope> 中。这意味着依赖的 jar 版本已经存在于 felix 容器中。例如当你添加

           <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.21</version>
                <scope>provided</scope>
            </dependency>

当maven构建jar时,它不会嵌入这些依赖。但是在运行时,它会期望这个版本会出现在 JDK 或 felix 容器中。幸运的是 felix 也提供了相同版本的 jar 和代码作品。

在 jsoup 的情况下,这在 felix 中不可用。这意味着您必须将罐子从外面强行推入 felix 容器中。有两种方法可以做到这一点,将 jar 打包到它的包中并推送到 felix。但更好的方法是 include 依赖,这样每次部署时,jsoup.jar 也会与 core.jar 一起被推送到 felix 容器中。

执行此操作的步骤:

  1. 从父 pom.xml 添加依赖项。这将添加带有编译范围的 jsoup
           <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.12.1</version>
            </dependency>
  1. 在核心 pom.xml 中,在 maven-dependency-plugin 下,添加另一个执行步骤,如图所示。这会将 jar 复制到 felix 中
               <executions>
                  <execution>
                    <id>copy-dependency</id>
                    <goals>
                      <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                      <includeArtifactIds>jsoup</includeArtifactIds>
                    </configuration>
                  </execution>
                </executions>
  1. 接下来我们必须绑定正确的版本。在 bnd-maven-plugin 下添加另一个像这样的执行步骤
<executions>
                    <execution>
                        <id>bnd-process</id>
                        <goals>
                            <goal>bnd-process</goal>
                        </goals>
                        <configuration>
                            <bnd><![CDATA[
Import-Package: org.jsoup.*;version=1.12.1,!sun.misc.*;resolution:=optional,*
-exportcontents: ${packages;VERSIONED},org.jsoup.*;version=1.12.1
Include-Resource: target/dependency/jsoup-1.12.1.jar
Bundle-ClassPath: ., jsoup-1.12.1.jar
Sling-Model-Packages: com.myproject.core.models
-snapshot: ${tstamp;yyyyMMddHHmmssSSS}
Bundle-DocURL:
-plugin org.apache.sling.caconfig.bndplugin.ConfigurationClassScannerPlugin
                                 ]]></bnd>
                        </configuration>
                    </execution>
                </executions>
  1. 最后像这样将jsoup依赖添加到core pom.xml中
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
        </dependency>

确保不要在 pom.xml 中留下任何语法错误,否则构建将失败。

【讨论】:

    猜你喜欢
    • 2022-10-06
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2013-06-27
    • 2017-11-06
    • 2021-06-13
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多