Тестовая зависимость Maven в многомодульном проекте
Я использую Maven для создания многомодульного проекта. Мой модуль 2 зависит от модуля 1 src в области компиляции, а модуль 1 - в области тестирования.
Модуль 2 -
<dependency>
<groupId>blah</groupId>
<artifactId>MODULE1</artifactId>
<version>blah</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
Это отлично работает. Скажем, мой модуль 3 зависит от модуля Module 1 src и тестов во время компиляции.
Модуль 3 -
<dependency>
<groupId>blah</groupId>
<artifactId>MODULE1</artifactId>
<version>blah</version>
<classifier>tests</classifier>
<scope>compile</scope>
</dependency>
Когда я бегу mvn clean install
моя сборка работает до модуля 3, происходит сбой в модуле 3, поскольку она не может разрешить тестовую зависимость модуля 1. Тогда я делаю mvn install
только на модуле 3 вернитесь назад и запустите mvn install
на моем родительском поме, чтобы заставить его строить. Как я могу это исправить?
3 ответа
У меня есть сомнения относительно того, что вы пытаетесь сделать, но я предполагаю, что вы хотите повторно использовать тесты, созданные вами для проекта (module1), в другом. Как объясняется в примечании внизу Руководства по использованию прилагаемых тестов:
Обратите внимание, что предыдущие выпуски этого руководства предлагали использовать
<classifier>tests</classifier>
вместо<type>test-jar</type>
, Хотя в настоящее время это работает в некоторых случаях, оно не работает должным образом во время сборки реактора тестового модуля JAR и любого потребителя, если вызывается фаза жизненного цикла перед установкой. В таком случае Maven будет разрешать тестовый JAR не из выходных данных сборки реактора, а из локального / удаленного хранилища. По-видимому, JAR из репозиториев может быть устаревшим или полностью отсутствующим, что приведет к сбою сборки (см. MNG-2045).
Итак, во-первых, чтобы упаковать скомпилированные тесты в JAR и развернуть их для общего повторного использования, настройте maven-jar-plugin
следующее:
<project>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Затем установите / разверните тестовый JAR-артефакт как обычно (используя mvn install
или же mvn deploy
).
Наконец, чтобы использовать тестовый JAR, вы должны указать зависимость с указанным типом test-jar
:
<project>
...
<dependencies>
<dependency>
<groupId>com.myco.app</groupId>
<artifactId>foo</artifactId>
<version>1.0-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies>
...
</project>
Что касается моего комментария к вопросу Паскаля, я думаю, что нашел ответ на вопрос:
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
<phase>test-compile</phase>
</execution>
</executions>
<configuration>
<outputDirectory>${basedir}\target</outputDirectory>
</configuration>
</plugin>
</plugins>
Основное отличие здесь, как вы видите здесь, заключается в <phase>
тег.
Я создам тестовую флягу, и она будет доступна на этапе компиляции тестов, а не только после фазы пакета.
Работает для меня.
Как говорит https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html:
Как создать банку, содержащую тестовые классы Если вы хотите создать банку, содержащую тестовые классы, вы, вероятно, захотите использовать эти классы повторно. Есть два способа решить это:
The easy way
Создайте прикрепленный jar с тестовыми классами из текущего проекта и потеряйте его транзитивные зависимости в тестовой области.
The preferred way
Создайте отдельный проект с тест-классами.
Пожалуйста, прочитайте эту статью для деталей.