Maven 找不到从另一个模块导入的类,但 Intellij 可以找到



我有多模块maven项目。验收测试模块依赖于pom.xml中的api(用xxx替换真实的公司名称以保持机密性(。我正在尝试从验收测试中的api模块导入一些类。

这是我的pom.xml验收测试模块的依赖:

<dependency>
<artifactId>xxx-api</artifactId>
<groupId>com.xxx</groupId>
<version>${xxx.api.version}</version>
</dependency>

maven正在单独安装和打包api模块(mvn-installmvn-package(,没有任何问题。jar文件正在我的本地.m2.中创建

然而,当我试图编译验收测试模块时,我会收到一个编译错误,说由于找不到包,所以无法导入类。

以下是实际错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project xxx-acceptance-tests: Compilation failure: Compilation failure: 
[ERROR] /Users/andranik_chorokhyan/mydisk/Projects/XXX/automation/xxx-project-test-automation/xxx-acceptance-tests/src/main/java/com/xxx/xxx/utilities/api/ApiPayloadUtils.java:[17,38] package com.xxx.domain.dto does not exist
[ERROR] /Users/andranik_chorokhyan/mydisk/Projects/XXX/automation/xxx-project-test-automation/xxx-acceptance-tests/src/main/java/com/xxx/xxx/utilities/api/ApiPayloadUtils.java:[18,38] package com.xxx.domain.dto does not exist
[ERROR]   symbol:   class MappingData
[ERROR]   location: class com.xxx.utilities.api.ApiPayloadUtils

一个更有趣的事实是Intellij IDEA中没有可见的错误。没有红色下划线,没有编译错误,导航到适当的导入文件没有问题。实际上,com.xxx.domain.dto包和MappingData类确实存在。

我从本地.m2存储库中删除了整个xxx目录,并执行了mvn clean dependency:resolve命令。它也成功了。

有人知道这里的问题是什么以及如何解决吗?提前感谢!

终于找到了解决方案。感谢JF Meier和khmarbaise的提示。

Maven似乎不允许依赖于可执行jar文件。这就是我的情况。我的api模块是一个可执行的Spring Boot应用程序,不可重用库。

因此,解决方案如下:

  1. 有必要在api模块中查找Application.java文件
  2. 添加maven-jar-plugin,排除Application.java文件和指定一些分类器
  3. 从上面指定的分类器而不是标准jar在acceptance-tests模块中进行依赖

下面api模块中的插件规范:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>qa</classifier>
<excludes>
<exclude>**/Application*</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>

下面验收测试模块中的依赖项:

<dependency>
<artifactId>xxx-api</artifactId>
<groupId>com.xxx</groupId>
<version>${api.version}</version>
<classifier>qa</classifier>
</dependency>

在使用maven编译时,我也遇到了未找到符号的错误,解决方案是针对spring-boot 2,您需要如下配置插件,classifier-exec

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>

如果您使用的是弹簧靴1

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>

最新更新