2009-11-12 3 views
69

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

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

+0

Не могли бы вы рассказать, как выглядит ваш родительский pom? –

ответ

104

У меня есть сомнения в том, что вы пытаетесь сделать, но я предполагаю, что вы хотите повторно использовать те тесты, которые вы создали для проекта (module1), в другом. Как поясняется в примечании в нижней части Guide to using attached tests:

Обратите внимание, что предыдущие издания данного руководства предложил использовать <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.Если я не хочу выполнять какую-либо установку развертывания в тестовую банку и просто проверять новую копию с внешней стороны и запускать тест mvn. Это не удается, поскольку у меня еще нет тестовой банки. Любая идея, как с этим бороться? – Roman

+0

@ Roman Запуск установки является «естественным» способом. Но похоже, что вы нашли обходной путь. –

+0

Кажется, что эта проблема 3559 не 2045, которая находится в этом состоянии: http://jira.codehaus.org/browse/MNG-3559 – HDave

15

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

<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, это было очень полезно. –

+1

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

Смежные вопросы