Залежність тесту 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.