Maven не находит импортированный класс из другого модуля, но Intellij делает - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть многомодульный проект Maven. Модуль приемочные испытания зависит от модуля api в pom. xml (Замена реального названия компании на xxx для сохранения конфиденциальности). Я пытаюсь импортировать некоторые классы из api модуля в моих приемочных тестах .

Вот моя pom. xml зависимость приемочные испытания * модуль 1020 *:

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

Модуль api отдельно устанавливается и упаковывается ( mvn install , mvn package ) Maven без каких-либо проблем. Файл 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 .

Я удалил целое xxx из моего локального .m2 хранилища и выполнил команду mvn clean dependency:resolve. Это также удалось.

Кто-нибудь знает, в чем здесь проблема и как ее можно решить? Заранее спасибо!

1 Ответ

0 голосов
/ 22 апреля 2020

Наконец-то я нашел решение. Спасибо JF Meier и khmarbaise за подсказки.

Оказалось, что Maven не допускает зависимости от исполняемого файла jar. Это был мой случай. Мой api модуль был исполняемым Spring Boot приложением, а не многоразовой библиотекой.

Итак, решение было следующим:

  1. It было необходимо найти файл Application.java в модуле api.
  2. Добавить maven-jar-plugin за исключением файла Application.java и спецификации некоторого классификатора
  3. Создание зависимости в acceptance-tests модуль из указанного выше классификатора вместо стандартного jar

Спецификация плагина в 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>
...