Maven: Lifecycle vs. Phase vs. Plugin vs. Goal [закрыто]

106

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

  • Жизненный цикл
  • Фаза
  • Плагин
  • Цель

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

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

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

Джефф Левин
источник
Спасибо @Drejc - не могу поверить, что не нашел этого в поиске. Я сейчас прочитаю.
Джефф Левин
2
Итак, чтобы уточнить, построить жизненный цикл = жизненный цикл , из которых есть три типа: по умолчанию, чистый и сайт? Другие объяснения заставили меня подумать, что существует четвертый жизненный цикл, называемый сборкой .
Джефф Левин
3
Слишком широкий? Это касается основных основ Maven и дает несколько хороших и подробных ответов. Модераторы без единственного тега maven не должны иметь права решать это.
Герольд Брозер

Ответы:

73

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

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

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

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

Цели также могут быть выполнены напрямую, о чем вам сообщают при запуске mvnбез какой-либо фазы или цели [с переносом строки и сокращенными для удобства чтения]:

You must specify a valid lifecycle phase or a goal in the format

<plugin-prefix>:<goal> or

<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

Available lifecycle phases are:

... see actual output or 'Maven, Introduction to the Build Lifecycle' at 'References' below ...

Ссылки:

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

Фазы для встроенных жизненных циклов ( чистый , по умолчанию , сайт ) объявлены <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xmlниже .../<component>/<role>org.apache.maven.lifecycle.Lifecycle.

Джеральд Брозер
источник
41

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фазы (различные фазы) для компиляции тестового кода ( с помощью своей testCompileцели) в другом исполнении ( default-testCompile). Вы также можете скомпилировать (используя тот же плагин и цель) некоторый автоматически сгенерированный код на другой фазе, как это определено выполнением, которое вы указали в POM (и, возможно, другой конфигурации).

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

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

Вкратце : выполнение сообщает Maven, какую цель (цели) выполнить, с какой конфигурацией и на какой фазе.

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

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

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

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

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

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

A_Di-Matteo
источник
18

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

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

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

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

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

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

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

mvn clean

Это вызовет предварительную очистку и очистку .

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

Цель похожа на действие в плагине . Итак, если плагин - это класс, цель - это метод.

вы можете назвать цель так:

mvn clean:clean

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

3. Теперь соотношение между фазой и целью:

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

mvn clean

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

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

mvn pre-clean clean:clean
Сурасин Танчароен
источник
1
@ 2. & 3. ИМХО, clean:cleanэто не лучший выбор для примера. Названы 4 элемента clean(жизненный цикл, фаза, плагин, цель), которые могут сбивать с толку, особенно для новичков (я помню, что это было для меня в начале). @ 3. ИМХО, глагол «ссылка» тоже не лучший вариант. Официальный термин Maven - « привязка ».
Gerold Broser
@GeroldBroser. Полностью согласен с clean: clean. Я объяснил и предупредил об этом в моем полном объяснении по ссылке. Я скопирую и эти предупреждения сюда. Причина, по которой я использовал его, потому что это хорошо, чтобы люди знали об этом запутанном слове, и особенно в официальном документе maven, который его использует, и это ясно объясняет. И да, меня это тоже сбивало с толку. В любом случае, большое спасибо за комментарии
Surasin Tancharoen
опечатка: официальный документ maven использует это и не объясняет это четко
Surasin Tancharoen
17

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

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

Жизненные циклы, фазы, цели, плагины Maven

Дэвид Тонхофер
источник
Файл graphml (отредактированный с помощью бесплатного редактора yEd) доступен по адресу github.com/dtonhofer/diagrams
Дэвид Тонхофер,
1) Что именно вы подразумеваете под « вызываемыми фазами », которые « темно-синего цвета »? Каждая фаза Maven является «вызываемой» (хотя я скорее называю ее вызываемой , поскольку нет кода, вызываемого напрямую путем вызова фазы). Или вы называете фазы « вызываемыми », с которыми связана цель (по умолчанию)? Даже это не правда, если вы посмотрите на validate, initializeи verify.
Герольд Брозер
2) resources:[testR|r]esourcesЦель НЕ привязана к этапам process-sourcesили process-test-sourcesэтапам jarжизненного цикла .
Герольд Брозер
3) modello:javaиз Modello плагин , видимо, к конкретному домену. Привязка цели плагина к фазе удерживается для любой из фаз.
Герольд Брозер
@GeroldBroser Исправлено по комментариям. «Вызываемый» означает, что его можно вызвать из командной строки и ожидать, что проект останется в допустимом состоянии. Там нет смысла различия между вызовом и вызова и для вызова является то , что Maven Введение использует.
Дэвид Тонхофер
12

Источник, это действительно хороший учебник

Жизненные циклы, фазы жизненного цикла, плагины и цели плагинов - это ядро ​​Maven.

  • Команда Maven mvn может принимать в качестве аргумента только этап жизненного цикла или цель подключаемого модуля.
  • Maven имеет три жизненных цикла: по умолчанию, чистый и сайт.
  • Каждый жизненный цикл состоит из фаз жизненного цикла, и всего существует 28 фаз: по умолчанию 21 ( проверка, ..., компиляция, ..., пакет, ..., установка, развертывание ), очистка 3 ( предварительная очистка, чистый, пост-очистка ) и сайт 4 ( предварительный сайт, сайт, пост-сайт, развертывание сайта ).
  • когда фаза жизненного цикла вызывается с помощью команды mvn, все предыдущие фазы выполняются последовательно одна за другой.
  • Сами по себе фазы жизненного цикла не имеют никаких возможностей для выполнения некоторых задач, и они полагаются на плагины для выполнения задачи.
  • В зависимости от проекта и типа упаковки Maven связывает различные цели плагина с фазами жизненного цикла и цели, выполняющие возложенную на них задачу.

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

mvn-плагины-пакет-цель

Ерлан
источник
1
Материал, который вы упомянули, очень хорош. Спасибо!
Уильям Кинаан
@ « Команда Maven mvn может принимать в качестве аргумента только фазу жизненного цикла или цель плагина. » Неверно. Он также принимает варианты .
Gerold Broser
« Когда мы запускаем« mvn package »в проекте Java, Maven связывает цели подключаемого модуля с фазами жизненного цикла », это неверно. Привязка к цели происходит задолго до запуска mvn ...: в default-bindings.xml или в POM, и это делается не Maven, а человеком.
Герольд Брозер
7

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

Сборки Maven разделены на следующие жизненные циклы:

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

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

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

Фазы имеют цели , которые должны выполняться до заранее или после пост- фазы, например:

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

При желании вы можете рассматривать цели как дополнительные «вставленные» фазы. Прочтите здесь или ознакомьтесь с ответом @Gerolds для подробностей.

Дрейц
источник
1
Этот ответ не совсем правильный. Смотрите мой ответ .
Gerold Broser
О мальчик, 3 года с тех пор, как ты ответил на этот вопрос ... и все еще не отпускал его ... ты выиграл ... теперь иди дальше.
Drejc 04
Дело не в победе. Разве вы не пересматриваете старые вопросы, ответы и комментарии, если позже наткнетесь на них?
Герольд Брозер
3

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

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

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

Арун Раадж
источник
Ваш последний абзац вводит в заблуждение. Особенно первое и последнее предложение. Цели и этапы совершенно разные вещи. Вы не должны путать их, потому что некоторые из них имеют одинаковые названия. Re « Цели - это этапы, которые вы видите на картинке выше »: на картинке нет ни одной цели. Это все фазы . Re « Вы пишете имя фазы как« цель », когда вам нужно выполнить определенную цель. »: Хотя можно явно запустить цель плагина, обычный способ - выполнить сборку до определенной фазы с помощью mvn <phase>. Смотрите мой ответ здесь.
Герольд Брозер
Спасибо, я удалил часть «Плагин против цели». Скоро обновлю.
Арун Раадж