Зависимость теста Maven в многомодульном проекте

86

Я использую maven для создания многомодульного проекта. Мой модуль 2 зависит от модуля 1 src в области компиляции и тестов модуля 1 в области тестирования.

Модуль 2 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>test</scope>
   </dependency>

Это прекрасно работает. Скажем, мой модуль 3 зависит от Module1 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свой родительский pom, чтобы он построился. Как я могу это исправить?

user209947
источник
Не могли бы вы рассказать, как выглядит ваш родительский помпон?
Крис Гаммер,

Ответы:

127

У меня есть сомнения относительно того, что вы пытаетесь сделать, но я предполагаю, что вы хотите повторно использовать тесты, которые вы создали для проекта (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>
Паскаль Тивент
источник
3
Паскаль. Прежде всего, большое спасибо за ответы на все вопросы maven !! По поводу этого вопроса. У меня все еще есть проблема. У меня есть класс testBase в одном из моих основных модулей, который я хочу использовать во всех дочерних объектах. В настоящее время в нашем CI есть сборка maven. Если я не хочу делать какую-либо установку развертывания в тестовую банку, а просто проверить новую копию из магистрали и запустить тест mvn. Это не удается, так как у меня еще нигде нет тестовой банки. Есть идеи, как с этим бороться?
Роман
@Roman Запуск установки - это «естественный» путь. Но похоже, вы нашли обходной путь.
Паскаль Тивент,
Похоже, что проблема 3559, а не 2045, является задержкой
HDave
Хотя это объясняет, что происходит, но не дает решения. Он просто предлагает сделать то, что OP (и, например, I) уже делает.
Антониосс
19

Что касается моего комментария к вопросу Pascals, я думаю, что нашел стабильный ответ:

<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>тег.

Я создам тестовую банку, и она будет доступна на этапе компиляции тестов, а не только после фазы пакета.

Работает для меня.

Римский
источник
1
Да, очень удобно. Спасибо, что поделился. Я полагаю, что подход к развертыванию лучше, только когда у вас есть корпоративный каталог (да, я знаю, что это настоятельно рекомендуется). Спасибо @Roman
Дэмиен
2

Как говорит https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html :

Как создать банку, содержащую тестовые классы Если вы хотите создать банку, содержащую тестовые классы, вы, вероятно, захотите повторно использовать эти классы. Есть два способа решить эту проблему:

  1. The easy way Создайте прикрепленный jar-файл с тестовыми классами из текущего проекта и избавьтесь от его транзитивных зависимостей в тестовой области.

  2. The preferred way Создайте отдельный проект с тестовыми классами.

Пожалуйста, прочтите эту статью для получения подробной информации.

Тупой
источник