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