Здесь относительно новый разработчик, хотя я использую его некоторое время, я надеюсь закрепить свои основы Maven. Частично моя проблема в том, что у меня нет опыта работы с Ant, что, по-видимому, является причиной многих объяснений. Я читал и смотрел учебные пособия и постоянно слышу одни и те же термины:
- Жизненный цикл
- Фаза
- Плагин
- Цель
Из того, что я узнал, кажется, что жизненный цикл является самым широким из множества и состоит из (или завершается) этапов, плагинов и / или целей.
Вопрос : Не могли бы вы предоставить какую-либо информацию о том, как связаны эти термины, и о наиболее распространенных примерах?
Чем яснее и понятнее, тем лучше!
maven
maven-3
pom.xml
maven-lifecycle
Джефф Левин
источник
источник
Ответы:
Maven Жизненный цикл представляет собой (абстрактное) понятие , которое охватывает все этапы (или лучше: все шаги , Maven дизайнеры решили поддержки) , которые , как ожидается, произойдет в жизни развития проекта. Эти шаги (или этапы) в терминологии Maven называются фазами .
Maven плагин является контейнером для / поставщика целей. Реализованный в целях код - настоящая рабочая лошадка. ( Maven по своей сути просто управляет плагинами и выполняет цели ). Каждая цель плагина может быть назначена / привязана к любой фазе жизненного цикла.
При вызове
mvn <phase>
Maven проходит все фазы (каждый раз) и выполняет все цели (поставленные плагинами) , которые были привязаны к любой из фаз до и до (включительно) данной фазы. Если есть фаза, к которой не привязана цель, ничего не делается. Но фаза все же пройдена.Т.е. вы не можете «вставить» дополнительные фазы в один из встроенных жизненных циклов Maven. Они уже есть, всегда! Вы можете разработать свой собственный жизненный цикл с его собственными фазами, но это выходит далеко за рамки простого использования Maven как такового.
Цели также могут быть выполнены напрямую, о чем вам сообщают при запуске
mvn
без какой-либо фазы или цели [с переносом строки и сокращенными для удобства чтения]:Ссылки:
Если вы когда-нибудь задумывались, как 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
.источник
Отвечу поздно, чтобы прояснить еще один уровень детализации, отсутствующий в этом потоке: выполнение (цели), которые являются наименьшими единицами сборки Maven.
Следовательно, у нас есть циклы сборки (в основном, набор действий для определенной общей цели), которые состоят из фаз (более низкая детализация, шаг цикла), которые могут вызывать набор настроенных целей, предоставляемых определенными плагинами . То есть Maven (также) является исполнителем плагина, каждый плагин может предлагать одну или несколько целей. Затем вы (также) решаете, какая цель связана с какой фазой большую часть времени в жизненном цикле по умолчанию (без какой-либо цели, то есть по умолчанию). Но на самом деле у вас может быть еще один уровень: выполнение (одной и той же цели, из одного плагина или разных целей из разных плагинов).
Картина, которую я подготовил, чтобы возобновить все
И действительно, именно так Maven показывает его (свою наименьшую единицу работы) через уникальную строку в журнале сборки:
Например, у нас будет:
Что действительно означает (на разных уровнях детализации):
compile
фазы (к сожалению, не упоминается)>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
будет достаточно).Да, вы можете пропустить циклы сборки (и их фазы) и напрямую вызывать цели (плагинов). Представьте себе следующее:
(ПРИМЕЧАНИЕ: вы также можете вызвать встроенный только за один вызов)
Здесь мы компилируем код приложения, тестируем код, выполняем тесты и упаковываем: представьте, насколько это будет вручную, подвержено ошибкам, повторяющимся и трудоемким. Нам помогает соглашение о конфигурации: Maven представляет жизненные циклы и фазы сборки . Жизненный цикл по умолчанию (без имени, то есть по умолчанию) предоставляет ряд фаз, основанных на передовых методах и соглашениях (мантра Maven).
Если вы хотите добиться того же, что и выше, просто запустите:,
mvn package
и он автоматически скомпилирует, протестирует и упакует ваш проект. Как? вызов плагинов. То есть фазы - это значимый и настраиваемый набор выполнения плагинов (целей). Чтобы сделать его еще более стандартным, для каждой фазы Maven сначала будет вызывать любую предыдущую фазу, так что, например, если вы хотите протестировать, вы будете уверены, что сначала компилируете.ps обратите внимание, что при указании нескольких целей для одного и того же
execution
вы все равно четко увидите в журнале сборки два разных выполнения (с одним и тем же идентификатором) для двух разных целей (следовательно, все еще уникальный кортеж).источник
Благодарим Сандипа Джиндала и Премраджа (отсюда Каковы цели и фазы Maven и в чем их разница? ). Их объяснение помогает мне понять.
Я создал несколько полных примеров кода и несколько простых объяснений здесь https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Я думаю, это может помочь другим понять и попробовать что-то напрямую.
Короче говоря, вы не должны пытаться понять все три сразу, сначала вы должны понять отношения в этих группах:
1. Жизненный цикл против фазы
Жизненный цикл - это набор последовательных фаз , см. Здесь Ссылки на жизненный цикл . Когда вы вызываете фазу , она также вызывает все предшествующие ей фазы .
Например, чистый жизненный цикл состоит из 3 фаз ( предварительная очистка, очистка, последующая очистка ).
Это вызовет предварительную очистку и очистку .
2. Плагин против цели
Цель похожа на действие в плагине . Итак, если плагин - это класс, цель - это метод.
вы можете назвать цель так:
Это означает «назовите чистую цель в чистом плагине» (здесь ничего не связано с чистой фазой. Не позволяйте слову «очистить» вас сбить с толку, это не одно и то же! Полное объяснение см. В моей ссылке выше)
3. Теперь соотношение между фазой и целью:
Фаза может (до) связываться с целью (целями). Например, обычно чистая фаза связана с чистой целью. Итак, когда вы вызываете эту команду:
Он будет вызывать фазу предварительной очистки и фазу очистки, которая связана с целью clean: clean.
Это почти то же самое, что:
источник
clean:clean
это не лучший выбор для примера. Названы 4 элементаclean
(жизненный цикл, фаза, плагин, цель), которые могут сбивать с толку, особенно для новичков (я помню, что это было для меня в начале). @ 3. ИМХО, глагол «ссылка» тоже не лучший вариант. Официальный термин Maven - « привязка ».И с опозданием еще одна диаграмма
источник
validate
,initialize
иverify
.resources:[testR|r]esources
Цель НЕ привязана к этапамprocess-sources
илиprocess-test-sources
этапамjar
жизненного цикла .modello:java
из Modello плагин , видимо, к конкретному домену. Привязка цели плагина к фазе удерживается для любой из фаз.Источник, это действительно хороший учебник
Жизненные циклы, фазы жизненного цикла, плагины и цели плагинов - это ядро Maven.
Когда мы запускаем « mvn package » в проекте Java, Maven связывает цели плагина с фазами жизненного цикла, как показано на следующем рисунке.
источник
mvn ...
: в default-bindings.xml или в POM, и это делается не Maven, а человеком.Итак, чтобы объяснить немного подробнее, как описано здесь
Сборки Maven разделены на следующие жизненные циклы:
Каждый из этих циклов разбит на фазы. Например, сборка разбита на следующие этапы:
Фазы имеют цели , которые должны выполняться до заранее или после пост- фазы, например:
При желании вы можете рассматривать цели как дополнительные «вставленные» фазы. Прочтите здесь или ознакомьтесь с ответом @Gerolds для подробностей.
источник
LifeCycle vs Phases:
Life Cycle
представляет собой набор файловphases
. Когда вы вызываете фазу, она также вызывает все предшествующие ей фазы. Maven имеет 3 встроенных жизненных цикла сборки:Жизненный цикл очистки состоит из 3 этапов: предварительной очистки, очистки и последующей очистки. Фазы жизненного цикла по умолчанию и сайта такие же, как показано на рисунке.
источник
mvn <phase>
. Смотрите мой ответ здесь.