Maven: жизненный цикл против фазы против плагина против цели
Относительно новый разработчик, хотя я и пользуюсь им некоторое время, я надеюсь укрепить основы Maven. Часть моей проблемы заключается в том, что у меня нет опыта работы с Ant, что, как представляется, объясняется многими объяснениями. Я читал и смотрел учебники, и я продолжаю слышать одни и те же термины:
- Жизненный цикл
- фаза
- Plugin
- Цель
Из того, что я узнал, кажется, что жизненный цикл является самым широким из множества и состоит из (или завершается) фаз, плагинов и / или целей.
Вопрос: Не могли бы вы предоставить какую-либо информацию о том, как эти термины связаны и наиболее распространенные примеры?
Чем яснее и понятнее, тем лучше!
7 ответов
Ответ @Drejc не является правильным в целом.
Особенно:
Каждый из этих этапов может иметь целью запуск
до или после этапа, например:
•предустановка - ...
•пост-пакет - ...
Вы можете просматривать цели как дополнительные "вставленные" фазы, если хотите.
[Зачеркнутые мной неверные высказывания.]
Жизненный цикл Maven - это (абстрактная) концепция, которая охватывает все этапы (или лучше: все этапы, которые разработчики Maven решили поддержать) , которые должны произойти в течение срока разработки проекта. Эти этапы (или этапы) называются этапами в терминологии Maven.
Плагин Maven - это контейнер для / поставщика целей. Код, реализованный в целях, является настоящей рабочей лошадкой. ( Сам по себе Maven просто управляет плагинами и выполняет задачи). Каждая из целей плагина может быть назначена / привязана к любой из фаз жизненного цикла.
При вызове mvn <phase>
Maven проходит все фазы (каждый раз) и выполняет все цели (предоставленные плагинами) , которые были связаны с любой из фаз до и вплоть до (и включая) данной фазы. Если есть фаза без цели, ничего не делается. Но фаза все же пройдена.
Т.е. вы не можете "вставить" дополнительные фазы " в один из встроенных жизненных циклов Maven. Они уже здесь, всегда! Вы можете разработать свой собственный жизненный цикл с его собственными фазами, но это далеко не просто использование Maven.
Фазы, называемые "pre-install" или "post-package", не существуют.
Рекомендации:
Maven, Введение в жизненный цикл сборки
Если вы когда-нибудь задумывались, как 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 является (также) исполнителем плагинов, каждый плагин может предлагать одну или несколько целей. Затем вы (также) решаете, какая цель к какой фазе прикреплена, в большинстве случаев в жизненном цикле по умолчанию (без каких-либо, то есть по умолчанию). Но на самом деле у вас может быть еще один уровень: казни (одной и той же цели, из одного и того же плагина или разных целей из разных плагинов)
Картину, которую я подготовил, чтобы возобновить все
И действительно, вот как 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 из 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
вы все равно будете четко видеть в журнале сборки два разных выполнения (с одинаковым идентификатором) для двух разных целей (следовательно, все еще уникальный кортеж).
И с опозданием еще одна диаграмма
- Жизненные циклы в виде желтых прямоугольников
- Фазы жизненных циклов в виде синих прямоугольников с "вызываемыми" фазами темно-синего цвета (то есть фазы с гипенацией обычно не вызываются из командной строки, так как они не могут быть предназначены для того, чтобы оставить проект в четко определенном состоянии).
- Цели как голубые ромбы. Показанная ассоциация / привязка "фаза -> цель" относится к режиму упаковки"jar". С каждым этапом могут быть связаны цели. Это верно, конечно, для каждого из жизненных циклов, хотя привязки показаны только для жизненного цикла "по умолчанию".
- Плагины в виде серых обрезанных прямоугольников. Плагины предоставляют Цели, которые могут быть связаны с Фазами.
Отдайте должное Сандипу Джиндалу и Премраю (отсюда Каковы цели и фазы Maven и в чем их отличие?). Их объяснение помогает мне понять.
Я создал несколько полных примеров кода и несколько простых пояснений здесь https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/. Я думаю, что это может помочь другим понять и попробовать что-то напрямую.
Короче говоря, по ссылке не следует пытаться понять все три сразу, сначала вы должны понять отношения в этих группах:
- Жизненный цикл против фазы
- Плагин против цели
1. Жизненный цикл против фазы
Жизненный цикл представляет собой набор последовательностей фаз, см. Здесь ссылки на жизненный цикл. Когда вы вызываете фазу, она также вызывает все фазы до нее.
Например, чистый жизненный цикл состоит из 3 этапов (предварительная очистка, очистка, последующая очистка).
mvn clean
Будем называть предварительно чистыми и чистыми.
2. Плагин против цели
Цель похожа на действие в плагине. Так что, если плагин - это класс, цель - это метод.
Вы можете назвать цель как это:
mvn clean:clean
Это означает "назовите чистую цель в чистом плагине" (здесь ничего не относится к чистой фазе. Не позволяйте слову "очистить" сбить вас с толку, они не совпадают! Смотрите полное объяснение в моей ссылке выше)
3. Теперь связь между этапом и целью:
Фаза может (предварительно) связываться с Целями. Например, обычно, чистая фаза связана с чистой целью. Итак, когда вы вызываете эту команду:
mvn clean
Он будет называть этап предварительной очистки и этап очистки, который связан с целью очистки: очистки.
Это почти так же, как:
mvn pre-clean clean:clean
Источник: http://www.codetab.org/apache-maven-tutorial/, это действительно хороший учебник
Жизненные циклы, фазы жизненного цикла, плагины и цели плагинов являются ядром Maven.
- Команда Maven mvn может принимать в качестве аргумента только фазу жизненного цикла или цель плагина.
- Maven поставляется с тремя жизненными циклами - по умолчанию, чистый и сайт.
- Каждый жизненный цикл состоит из фаз жизненного цикла, и всего существует 28 фаз - по умолчанию 21(проверка,..., компиляция,..., упаковка,..., установка, развертывание), очистка 3(предварительная очистка, clean, post-clean) и сайт 4(pre-site, site, post-site, site-deploy).
- когда фаза жизненного цикла вызывается с помощью команды mvn, все предыдущие фазы выполняются последовательно один за другим.
- Фазы жизненного цикла сами по себе не имеют никаких возможностей для выполнения какой-либо задачи, и для их выполнения они используют плагины.
- В зависимости от проекта и типа упаковки, Maven связывает различные цели плагинов с фазами жизненного цикла и задачами, выполняя порученную им задачу.
Когда мы запускаем "пакет mvn" в Java-проекте, Maven связывает цели плагинов с фазами жизненного цикла, как показано на следующем рисунке.
Поэтому, чтобы объяснить немного дальше, как изложено здесь
Сборки Maven разбиты по жизненным циклам:
- чистый
- сборка (по умолчанию)
- сайт
Каждый из этих циклов разбит на фазы. Например, сборка разбита на фазы, такие как:
- подготовить ресурсы
- компилировать
- пакет
- устанавливать
Фазы имеют цели для запуска до или после фазы, например:
- предварительная очистка - будет выполнена до этапа очистки
- после очистки - будет выполнен после этапа очистки
Вы можете просматривать цели как дополнительные "вставленные" фазы, если хотите. Читайте здесь или посмотрите ответ @Gerolds для деталей.
LifeCycle vs Phases:Life Cycle
это коллекция phases
, Когда вы вызываете фазу, она также вызывает все фазы, которые предшествуют ей.
Maven поставляется с 3 встроенными жизненными циклами сборки:
- Чистый жизненный цикл - это включает в себя очистку проекта (для новой сборки и развертывания)
- Default / build жизненный цикл - это обрабатывает полное развертывание проекта
- Жизненный цикл сайта - это обрабатывает создание документации Java проекта.
Чистый жизненный цикл состоит из 3 этапов: предварительная очистка, очистка и последующая очистка. Фазы по умолчанию и жизненные циклы сайта такие же, как показано на рисунке.