"cannot be resolved to a type" aem项目添加依赖后出错

"cannot be resolved to a type" error after adding depenency in aem project

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

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 依赖关系,这样 core.jar 也会在每次部署期间将 jsoup.jar 推入 felix 容器。

执行此操作的步骤:

  1. 从父 pom.xml 添加依赖项。这将添加具有编译范围
  2. 的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 依赖项添加到核心 pom.xml
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
        </dependency>

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