"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 容器。
执行此操作的步骤:
- 从父 pom.xml 添加依赖项。这将添加具有编译范围
的jsoup
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
- 在核心 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>
- 接下来我们要绑定正确的版本。在 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>
- 最后像这样将 jsoup 依赖项添加到核心 pom.xml
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
</dependency>
确保不要在 pom.xml 中留下任何语法错误,否则构建将失败。
我在我的 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 容器。
执行此操作的步骤:
- 从父 pom.xml 添加依赖项。这将添加具有编译范围 的jsoup
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
- 在核心 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>
- 接下来我们要绑定正确的版本。在 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>
- 最后像这样将 jsoup 依赖项添加到核心 pom.xml
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
</dependency>
确保不要在 pom.xml 中留下任何语法错误,否则构建将失败。