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

Ответ 1

У меня есть сомнения в том, что вы пытаетесь сделать, но я предполагаю, что вы хотите повторно использовать те тесты, которые вы создали для проекта (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>

Ответ 2

Что касается моего комментария к вопросу о Паскалях, я думаю, что нашел подходящий ответ:

<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>.

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

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