Тестовая зависимость Maven в многомодульном проекте - PullRequest
79 голосов
/ 13 ноября 2009

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

Ответы [ 3 ]

115 голосов
/ 14 ноября 2009

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

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

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

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

У меня работает.

2 голосов
/ 30 сентября 2018

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

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

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

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

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

...