Maven: жизненный цикл против фазы против плагина против цели

Относительно новый разработчик здесь, хотя я использовал его ненадолго, я надеюсь укрепить мои основы Maven. Часть моей проблемы заключается в том, что у меня нет опыта работы с Ant, который, как представляется, объясняется тем, что объясняется многими объяснениями. Я читал и смотрел учебники, и я продолжаю слышать те же слова:

  • Жизненный цикл
  • фаза
  • Plugin
  • objective

Из того, что я узнал, кажется, что жизненный цикл является самым широким из множества и состоит из (или завершенных) этапов, плагинов и / или целей.

Вопрос : Не могли бы вы предоставить какую-либо информацию о том, как эти термины связаны и являются наиболее распространенными примерами?

Чем яснее и понятнее, тем лучше!

@ Ответ Дрейка неверен во всей полноте.

В частности:

На каждом из этих этапов может быть поставлена ​​задача выполнить предварительную или последующую фазу, например:

предварительная установка – …
post-package – …

Вы можете просмотреть цели как дополнительные «вставленные» фазы, если хотите.

[Зачеркивания неправильных высказываний.]

Жизненный цикл Maven представляет собой (абстрактную) концепцию, охватывающую все этапы (или, лучше, все этапы, которые разработчики Maven решили поддержать), которые, как ожидается, появятся в процессе разработки проекта. Эти этапы (или этапы) называются фазами в терминологии Мейвена.

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

При вызове mvn Maven передает все фазы (каждый раз) и выполняет все цели (поставляемые плагинами) , которые были привязаны к любой из фаз до и вплоть до (и включая) данной фазы. Если есть фаза без привязки к цели, ничего не делается. Но фаза все же проходит.

Т.е. вы не можете «вставить» дополнительные фазы в один из встроенных жизненных циклов Maven. Они уже там, всегда! Вы можете разработать свой собственный жизненный цикл с его собственными фазами, но это далеко не просто использование Maven, как есть.

Фазы, называемые «pre-install» или «post-package» , не существуют.

Рекомендации:

  • Maven, Введение в жизненный цикл сборки

    Если вы когда-нибудь задавались вопросом, как Maven знает, что делать без привязки цели в POM, в конце есть ссылка на default-bindings.xml которая находится в /lib/maven-core-xyzjar/META-INF/plexus/default-bindings.xml .

    Фазы для встроенных жизненных циклов ( чистые , по умолчанию , сайт ) объявлены в /lib/maven-core-xyzjar/META-INF/plexus/components.xml под ...//org.apache.maven.lifecycle.Lifecycle .

  • Maven: полный справочник, глава 4. Жизненный цикл сборки

  • Maven по примеру 3.5. Основные понятия

Maven: жизненный цикл против фазы против плагина против цели

Отвечая позже, чтобы прояснить еще один уровень детализации, отсутствующий в этом streamе: исполнение (цели), которые являются наименьшими единицами сборки Maven.

Следовательно, у нас есть цикл сборки (в основном, набор действий для конкретной общей цели), которые состоят из фаз (более низкая степень детализации, шаг цикла), которые могут вызывать набор настроенных целей, предоставляемых определенными плагинами . То есть, Maven является (также) исполнителем плагинов, каждый плагин может предложить один или несколько целей. Затем вы также решаете, какая цель привязана к какой фазе, в большинстве случаев в жизненном цикле defaul (без каких-либо, то есть по умолчанию). Но на самом деле у вас может быть еще один уровень: выполнение (одной цели из одного и того же плагина или разных целей из разных плагинов)

Картинку, которую я приготовил, чтобы возобновить целое введите описание изображения здесь

И именно так Maven показывает это (его наименьшая единица работы) через уникальную строку в своем журнале построения:

 plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name 

Например, мы имели бы:

 [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project --- 

Что действительно означает (через разные уровни детализации):

  • на этапе compile (к сожалению, не упомянуто)>
  • Я вызываю плагин Maven Compiler ( artifactId и version )>
  • Я вызываю его цель compile >
  • как определено выполнением default-compile по default-compile

Это уникально, потому что вы могли бы иметь одну и ту же цель (одного и того же плагина), привязанную к различным фазам или к одной и той же фазе, но в разных исполнениях (то есть с разными конфигурациями). Например, maven-compiler-plugin также используется во время фазы test-compile (другая фаза) для компиляции тестового кода (через его цель testCompile ) в другом исполнении ( default-testCompile ). Вы также можете скомпилировать (используя тот же плагин и цель) некоторый автоматически сгенерированный код в течение другой фазы, как определено в выполнении, указанном вами в POM (и потенциально другой конфигурации).

Исполнения по умолчанию предоставляются через коробки через привязки упаковки Maven , то есть по умолчанию (и принудительное согласование по конфигурации). Maven уже вызывает определенные цели (стандартных плагинов) на определенных этапах. Ионы выполнения этих вызовов по умолчанию определяются в соответствии с некоторыми соглашениями .

Это также объясняет, почему, если вы действительно хотите переопределить поведение по умолчанию (привязку) сборки Maven, вам нужно указать (переопределить) точно такой же идентификатор выполнения в вашем POM для того же плагина. Вы могли бы, например, пропустить компиляцию, просто определяя выполнение maven-compiler-plugin с тем же идентификатором default-compile но привязанным к не существующей фазе (или пустой).

Чтобы сделать его коротким : выполнение говорит Maven о том, какие цели выполнить, с какой конфигурацией в какой фазе.

Некоторые исполнения предоставляются по умолчанию (defaul bindings), что объясняет, почему минимальный pom maven всего из 6 строк уже может выполнять много (компиляция, тестирование, пакет и т. Д.): Выполнение целей стандартных плагинов на определенных этапах: это соглашение конфигурации. Затем через конфигурацию pom.xml вы можете добавить материал (выполнение) в сборку или повлиять на поведение уже настроенных плагинов (в этом случае не будет секций executions , но просто будет достаточно configuration ).

Да, вы можете пропустить циклы сборки (и их фазы) и напрямую ссылаться на цели (плагинов). Представьте себе следующее:

 mvn compiler:compile mvn compiler:testCompile mvn surefire:test mvn jar:jar 

(ПРИМЕЧАНИЕ: вы также можете вызвать inline только в одном вызове)

Здесь мы компилируем код приложения, тестовый код, выполняем тесты и пакет: представьте, как это будет ручным, подверженным ошибкам, повторяющимся и отнимающим много времени. Консультирование по настройке помогает нам: Maven вводит жизненные циклы и фазы сборки. Жизненный цикл по умолчанию (без имени, то есть по умолчанию) содержит ряд этапов, основанных на лучших практиках и соглашениях (мантра Maven).
Если вы хотите достичь того же, что и выше, просто запустите: mvn package и он автоматически скомпилирует, протестирует и упакует ваш проект. Как? вызывая плагины. То есть, этапы являются значимыми и настраиваемыми наборами плагинов (целей). Чтобы сделать его еще более стандартным, для каждой фазы Maven сначала вызовет любую предыдущую фазу, так что, например, если вы хотите протестировать, вы обязательно убедитесь, что сначала компилируете.

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

Кредит Сандип Джиндал и Премрадж (отсюда Что такое цели и фазы Maven и какова их разница? ). Их объяснение помогает мне понять.

Я создал несколько примеров кода и несколько простых объяснений здесь: https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Я думаю, что это может помочь другим понять и попробовать что-то прямо.

Вкратце от ссылки, вы не должны пытаться понять все три сразу, сначала вы должны понимать отношения в этих группах:

  • Жизненный цикл против фазы
  • Плагин против цели

1. Жизненный цикл против фазы

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

Например, чистый жизненный цикл имеет 3 фазы ( предварительная чистка, чистка, после очистки ).

 mvn clean 

Он будет называть чистым и чистым .

2. Плагин против цели

objective – это действие в плагине . Поэтому, если плагин является classом, цель – метод.

вы можете вызвать цель следующим образом:

 mvn clean:clean 

Это означает: «Назовите чистую цель в чистом плагине» (Ничто не относится к чистой фазе здесь. Не позволяйте слову «очищать» вас путать, они не совпадают! См. Полное объяснение в моей ссылке выше)

3. Теперь связь между Фазой и objectiveю:

Фаза может (pre) ссылаться на цели ( цели ). Например, как правило, чистая фаза соединяется с чистой целью. Итак, когда вы вызываете эту команду:

 mvn clean 

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

Это почти то же самое, что:

 mvn pre-clean clean:clean 

Источник: http://www.codetab.org/apache-maven-tutorial/ , это действительно хороший учебник

Lifecycles, фаз жизненного цикла, плагины и плагины – это сердцевина Maven.

  • Команда maven maven может принимать только аргумент Lifecycle Phase или Plugin Goal.
  • Maven поставляется с тремя жизненными циклами – по умолчанию, чистым и сайтом.
  • Каждый жизненный цикл состоит из фаз жизненного цикла и всего, существует 28 фаз – по умолчанию 21 ( проверка, …, компиляция, …, пакет, …, установка, развертывание ), очистка 3 ( предварительная очистка, чистый, пост-чистый ) и сайт 4 ( сайт, сайт, пост-сайт, сайт-развертывание ).
  • когда фаза жизненного цикла вызывается с помощью команды mvn, все предыдущие фазы выполняются последовательно один за другим.
  • фазы жизненного цикла сами по себе не имеют возможностей для выполнения какой-либо задачи, и они полагаются на плагины для выполнения задачи.
  • в зависимости от типа проекта и упаковки, Maven связывает различные плагиновые цели с этапами жизненного цикла и целями, выполняющими порученные им задачи.

Когда мы запускаем « mvn package » в Java Project, Maven связывает цели плагина с фазами жизненного цикла, как показано на следующем рисунке.

МВН-плагинов-пакет-цель

Поэтому, чтобы объяснить немного далее, как описано здесь

Конструкции Maven разделены на жизненные циклы:

  • чистый
  • строить (по умолчанию)
  • сайт

Каждый из этих циклов разделяется на фазы. Например, assembly разбивается на этапы, например:

  • подготовить ресурсы
  • компилировать
  • пакет
  • устанавливать

Фазы имеют цели для выполнения предварительной или последующей фазы, например:

  • pre-clean – будет выполняться до фазы очистки
  • после очистки – будет выполняться после чистой фазы

Вы можете просмотреть цели как дополнительные «вставленные» фазы, если хотите. Читайте здесь или посмотрите на ответ @Gerolds для деталей.

И с опозданием другая диаграмма

  • Lifecycles как желтые прямоугольники
  • Фазы жизненных циклов в виде синих прямоугольников с «вызываемыми» фазами в темно-синем (т.е. фазы с обдуванием обычно не вызывают из командной строки, поскольку они не могут быть предназначены для того, чтобы проект оставался в четко определенном состоянии).
  • Цели – голубые лепешки. Показанная ассоциация / привязка «фаза -> цель» является одним из режимов упаковки «банку». Каждая фаза может иметь цели, связанные с ней. Конечно, это относится к каждому из жизненных циклов, хотя привязки отображаются только для жизненного цикла «по умолчанию».
  • Плагины как серые обрезанные прямоугольники. Плагины обеспечивают Цели, которые могут быть привязаны к Фазам.

Maven Lifecycles, этапы, цели, плагины

LifeCycle vs Phases: Life Cycle – это совокупность phases . Когда вы вызываете фазу, она также будет вызывать все фазы, которые перед ней. Maven поставляется с 3 встроенными циклами жизненного цикла:

  1. Чистый жизненный цикл – это включает в себя очистку проекта (для новой сборки и развертывания)
  2. Default / build lifecycle – это полное развертывание проекта
  3. Жизненный цикл сайта – он обрабатывает Java-документацию проекта. введите описание изображения здесь

Чистый жизненный цикл имеет 3 фазы: предварительная чистка, чистка и последующая чистка. Фазы по умолчанию и жизненного цикла сайта такие же, как показано на рисунке.

  • Есть ли вообще исключить артефакты, унаследованные от родительского ПОМ?
  • Как указать версию компилятора Java в файле pom.xml?
  • Чтение файла свойств из файла POM в Maven
  • Ошибка при развертывании артефакта в Nexus
  • Удаление или удаление файлов ресурсов из целевого каталога с помощью файла pom
  • Давайте будем гением компьютера.