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

问题描述 投票:0回答:3

我有多模块 Maven 项目。 acceptance-tests 模块依赖于 pom.xml 中的 api 模块(用 xxx 替换真实公司名称以保密)。我正在尝试从我的 acceptance-tests 中的 api 模块导入一些类。

这是我的 pom.xml acceptance-tests 模块的依赖项:

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

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

文件

但是,当我尝试编译 acceptance-tests 模块时,出现编译错误,提示无法导入类,因为找不到包。

这是实际的错误:

[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
命令。也成功了。

有人知道这里有什么问题以及如何解决吗? 预先感谢!

java maven intellij-idea compilation multi-module
3个回答
8
投票

终于找到解决办法了。感谢 JF Meierkhmarbaise 的提示。

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

因此,解决方案如下:

  1. 需要在
    Application.java
    模块中找到
    api
    文件。
  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>

下面的acceptance-tests模块中的依赖关系:

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

8
投票

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

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

如果您正在使用 Spring Boot 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>

0
投票

适用于春季靴3 在库项目内部,pom.xml 应该删除 spring-boot-maven-plugin,因为不需要为库项目构建可执行 jar

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

查看更多详细信息多模块

© www.soinside.com 2019 - 2024. All rights reserved.