Добавление фаз в жизненный цикл Maven?

Я пытаюсь добавить некоторые дополнительные фазы в жизненный цикл Maven. Главным образом, чтобы добавить некоторые дополнительные уровни тестирования:

<phases>
    <phase>initialize</phase>
    <phase>process-resources</phase>
    <phase>compile</phase>
    <phase>process-test-resources</phase>
    <phase>test-compile</phase>
    <phase>test</phase>
    <phase>prepare-package</phase>
    <phase>package</phase>
    <phase>pre-integration-test</phase>
    <phase>integration-test</phase>
    <phase>post-integration-test</phase>
    <phase>pre-application-test</phase>
    <phase>application-test</phase>
    <phase>post-application-test</phase>
    <phase>pre-system-test</phase>
    <phase>system-test</phase>
    <phase>post-system-test</phase>
    <phase>finalize-tests</phase>
    <phase>install</phase>
    <phase>deploy</phase>
</phases>

Выше содержится новый этап тестирования приложения и тестирования системы (в том числе до и после).

Я запустил тестовый плагин по адресу: https://github.com/wemu/codezoo-lifecycle-maven-plugin. Я использую pom для тестирования в папке src / it.

Кажется, что новые этапы или что-то уже подобрано, но происходят некоторые странные вещи:

mvn post-application-test

Это работает. Также выполняется плагин echo, который я добавил для тестирования. Но есть некоторые предупреждения (используя maven 3.3.9).

mvn install

Выполняет жизненный цикл по умолчанию, пропуская новые фазы.

Если я изменяю идентификатор жизненного цикла fomr "test-level" на "default", фазы выполняются дважды.

Выданные предупреждения:

[WARNING] Duplicated lifecycle phase package. Defined in default but also in test-levels
[WARNING] Duplicated lifecycle phase pre-integration-test. Defined in default but also in test-levels
[WARNING] Duplicated lifecycle phase integration-test. Defined in default but also in test-levels
....

Исходный код, который выдает это предупреждение, указывает на то, что жизненный цикл не имеет должного пространства имен. Но я не могу понять, как это сделать.

Я нашел некоторые подсказки в сети: создать новую фазу (Stackru) или в других плагинах, таких как maven-scm-publish-plugin или docker-maven-plugin. Но они либо создают совершенно новый жизненный цикл, либо просто изменяют сопоставление плагинов со стандартного жизненного цикла maven.

Похоже, что всем остальным в Интернете по этой теме не менее 4 лет...

Так:

  • Как я могу добавить дополнительные фазы в жизненный цикл Maven по умолчанию (Если мне нужно повторить сопоставления плагинов по умолчанию: я могу жить с этим)
  • как я могу пространство имен нового жизненного цикла? Кажется, я создаю свою собственную упаковку (которая упоминается как подсказка роли в конфигурации). Но все же у maven есть запасной вариант к жизненному циклу по умолчанию.
  • могут ли фазы maven по умолчанию не использоваться повторно?

Текущее состояние тестового плагина на github.

Спасибо!

4 ответа

Вы можете взглянуть на плагин mvn-finisher, который добавляет несколько фаз, которые будут вызываться в конце сборки maven (для успеха, сбоя и прерывания)

Я не уверен, что возможно изменить жизненный цикл по умолчанию для готовых типов упаковки, но есть альтернативы. Вы можете использовать подход определения собственного плагина (с пользовательским типом упаковки или без него) или просто добавить несколько дополнительных тестовых выполнений в жизненный цикл по умолчанию.

Вариант 1 - Создать новый плагин с пользовательским жизненным циклом для стандартной упаковки

При таком подходе вы определяете совершенно новый жизненный цикл и явно указываете фазы.

Плюсы:

  • Полный контроль над всеми фазами, а также привязки плагинов для этих фаз
  • Больше СУХОГО, чем вариант 3, если вы обнаружите, что делаете одно и то же в нескольких несвязанных проектах

Минусы:

  • Требуется сохранение кода плагина.
  • Интеграция с IDE немного сложнее, так как требует выполнения нестандартных этапов.

Обратитесь к этому сообщению в блоге для пошагового руководства. Тогда вместо запуска mvn installвам нужно бежать mvn custom_install, Вы могли бы пойти дальше и определить свой собственный тип упаковки

Вариант 2. Создайте новый плагин с пользовательским типом упаковки и определите жизненный цикл по умолчанию.

Этот, вероятно, наиболее близок к подходу, который вы выбрали. Смотрите этот пост в блоге для примера.

Если вы выберете такой подход, ваш проект просто должен объявить <packaging>my-custom-packaging</packaging> в дополнение к добавлению вашего плагина с <extensions>true</extensions>,

Плюсы:

  • Полный контроль над всеми фазами, а также привязки плагинов для этих фаз
  • Больше СУХОГО, чем вариант 3, если вы обнаружите, что делаете одно и то же в нескольких несвязанных проектах
  • Вероятно, проще интегрировать с вашей IDE, чем вариант 1

Минусы:

  • Требуется поддержка кода плагина
  • Если вы хотите поддерживать несколько типов упаковки (jar, war, ear, и так далее), вам нужно будет определить собственные версии каждого из этих типов упаковки в вашем плагине.

Вариант 3. Добавление плагинов к жизненному циклу по умолчанию

Если вы готовы потерять некоторый контроль над тем, когда именно в жизненном цикле запускаются эти тесты, вы можете просто привязать выполнение новых плагинов к жизненному циклу по умолчанию. Я просто искал, как это сделать, и наткнулся на этот пост в блоге с описанием решения.

Плюсы:

  • Самый простой в реализации
  • Нет кода плагина для поддержки

Минусы:

  • Не могу определить пользовательские фазы жизненного цикла
  • Меньше СУХОГО, чем варианты 1 и 2

По сути, все, что вам нужно сделать, это определить новое выполнение плагина и поставить префикс ID выполнения с default-, Вот пример, который я только что сделал с плагином Maven Failsafe, чтобы добавить integration-test а также verify цели по умолчанию жизненного цикла проекта с jar упаковка:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>2.22.1</version>
  <executions>
    <execution>
      <id>default-system-test</id>
      <goals>
        <goal>integration-test</goal>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Когда я бегу mvn clean installвыполнение происходит как часть процесса сборки.

  • При необходимости можно добавить жизненный цикл и этапы.
  • Но рекомендуемый подход:
    • У вас уже есть четко определенная buildжизненный цикл с 24 phases
    • Реализуйте свой custom pluginесли вы не найдете его в репозитории maven и привяжете к любому phaseчто больше всего подходит.
    • Таким образом, его легко поддерживать, потому что каждый разработчик уже будет приведен в соответствие с фазами по умолчанию, и если вы добавили больше выполнения плагина к какой-либо конкретной фазе, легко понять, что вы хотите сделать.

Конечно, вы можете сделать свой проект настолько сложным, насколько захотите, но обычно считается плохой практикой добавлять жизненный цикл и фазы, пока у вас не будет очень большой вещи для управления в контексте жизненного цикла сборки.

Обычно в случае, когда вам нужны дополнительные фазы сборки - это сигнал о том, что вам нужно разделить ваш код и переместить его часть в дополнительный модуль maven, предназначенный для отдельных функций.

Добавьте зависимости между модулями, чтобы в результате после начала сборки Maven строил график модулей и строил их в ожидаемом порядке, один за другим.

Другие вопросы по тегам