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

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

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

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

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

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

Ответ 1

Ответ @Drejc не является правильным во всей полноте.

В частности:

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

pre- установить -...
Пакет post- -...

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

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

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

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

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

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

Фазы, которые называются "pre- установить" или "post- пакет" не существует.

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

Ответ 2

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

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

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

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

И именно так 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 выполнением

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

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

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

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

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

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

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

mvn clean

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

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

Цель - это действие в плагине. Поэтому, если плагин является классом, цель - метод.

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

mvn clean:clean

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

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

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

mvn clean

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

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

mvn pre-clean clean:clean

Ответ 4

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

Lifecycles, Фазы жизненного цикла, плагины и плагины - это ядра Maven.

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

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

mvn-plugins-package-goal

Ответ 5

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

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

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

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

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

У фаз есть цели для выполнения предшествующих pre - или после post - фазы, например:

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

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

Ответ 6

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

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

Maven Lifecycles, Phases, Goals, Plugins

Ответ 7

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

  1. Очистить lifecycle-, это включает в себя очистку проекта (для новой сборки и развертывания)
  2. Default/build lifecycle- обрабатывает полное развертывание проекта
  3. Сайт lifecycle- обрабатывает Java-документацию проекта. enter image description here

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