Залежність тесту 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на моєму батьківському пом, щоб він побудував. Як я можу це виправити?


Не могли б ви поділитися, як виглядає ваш батько?
Кріс Гаммер,

Відповіді:


127

Я сумніваюся у тому, що ви намагаєтесь зробити, але я припускаю, що ви хочете повторно використовувати тести, створені для проекту (модуль1), в іншому. Як пояснюється в примітці внизу Посібника щодо використання доданих тестів :

Зверніть увагу, що попередні видання цього посібника пропонували використовувати <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 в одному з основних модулів, який я хочу використовувати у всіх дочірніх об'єктах. Ми в даний час maven побудувати в нашому CI. Якщо я не хочу виконувати будь-яку інсталяцію розгортання в тестовому jar, а просто перевірити нову копію з магістралі та запустити тест mvn. Це не вдається, оскільки я ще ніде не маю тестувальника. Будь-яка ідея, як з цим боротися?
Роман

Встановлення @Roman Running - це "природний" спосіб. Але схоже, ви знайшли обхідний шлях.
Паскаль Тівент

Здається, саме ця проблема 3559, а не 2045, є тим, що затримується на цьому етапі: jira.codehaus.org/browse/MNG-3559
HDave

Хоча це пояснює те, що відбувається, воно не забезпечує обхідних шляхів. Це просто пропонує робити те, що вже робить OP (і, наприклад, I).
Antoniossss

19

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

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

Я створю тест-jar, і він буде доступний на етапі компіляції тестів, а не лише після фази пакетування.

Працює для мене.


1
Так, дуже зручно. Дякую, що поділились. Я думаю, підхід до розгортання кращий лише тоді, коли у вас є корпоративний каталог (так, я знаю, що це настійно рекомендується). Спасибі @Roman
Damien

2

Як пише https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html :

Як створити jar, що містить тестові класи Коли ви хочете створити jar, що містить тестові класи, ви, мабуть, захочете використати ці класи повторно. Є два шляхи вирішення цього:

  1. The easy way Створіть прикріплену банку з тестовими класами з поточного проекту та позбудьтеся її перехідних залежностей, охоплених тестом.

  2. The preferred way Створіть окремий проект за допомогою тестових класів.

Будь ласка, прочитайте цю статтю для деталей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.