Цели выполняются поэтапно, что помогает определить, в каком порядке выполняются цели заказа. Лучшее понимание этого состоит в том, чтобы взглянуть на привязки жизненного цикла Maven по умолчанию, которые показывают, какие цели выполняются в какие фазы по умолчанию. Цели этапа компиляции всегда выполняются до целей этапа тестирования, которые всегда выполняются до целей этапа пакета и так далее.
Частично путаница усугубляется тем фактом, что при выполнении maven вы можете указать цель или этап. Если вы укажете фазу, то maven будет запускать все фазы до фазы, указанной вами в указанном порядке (например, если вы укажете пакет, он сначала пройдет фазу компиляции, а затем фазу тестирования и, наконец, фазу пакета), и для каждой фазы будет выполнить все цели, связанные с этим этапом.
Когда вы создаете выполнение плагина в своем файле сборки Maven и указываете только цель, она будет привязана к данной фазе по умолчанию. Например, цель jaxb: xjc по умолчанию связывается с фазой создания ресурсов. Однако, когда вы указываете выполнение, вы также можете явно указать этап для этой цели.
Если вы зададите цель при выполнении Maven, он будет выполнять эту цель и только эту цель. Другими словами, если вы укажете цель jar: jar, она будет запускать только цель jar: jar для упаковки вашего кода в jar. Если вы ранее не выполняли цель компиляции или подготовили свой скомпилированный код каким-либо другим способом, это может с большой вероятностью завершиться неудачей.
У меня есть привычка говорить «Maven проходит все фазы (вплоть до заданного)» вместо «работает» или «выполняет» (последний, как его называют в « Введении в жизненный цикл сборки» Maven ). Такое отличие это более ясно от кода цели, который действительно выполняется. Но это может быть личным вкусом.
GeroldBroser восстанавливает Монику
Но мы также можем запускать цели, которые не относятся ни к одной фазе, т. mvn archetype:generateЕ. И в этом случае maven только выполняет цель?
Quazi Irfan
1
@Pace У вас есть ссылка на последний абзац? Я сомневался в этом и попробовал это с простым проектом здесь: mvn testrun:, в --- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:testто время как mvn compiler:testCompileпросто работает --- maven-compiler-plugin:3.1:testCompile ....
GeroldBroser восстанавливает Монику
4
@Pace mvn clean compiler:testCompileзапускается --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompileс ошибкой Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhase(где MvnPhaseнаходится тестируемый класс, на который есть ссылка в тестовом классе). Очевидно, фазы не вызываются, если цель вызывается явно.
GeroldBroser восстанавливает Монику
1
Основываясь на информации, полученной от geroldbroser и @ kekko12, я обновил последний абзац, указав, что при указании цели выполняется только эта цель, а не все предыдущие этапы.
Pace
188
Жизненный цикл - это последовательность названных фаз .
Этапы выполняются последовательно. Выполнение фазы означает выполнение всех предыдущих фаз.
Плагин представляет собой набор целей, также называемых MOJO ( M aven O ld J ava O bject).
Аналогия: плагин - это класс, а цели - это методы внутри класса.
Maven основан на центральной концепции Build Life Cycles . Внутри каждого Строительство циклов жизни есть Строительный Phases , так и внутри каждое Строительство фаз есть Строительные цели .
Мы можем выполнить либо этап сборки, либо построить цель. При выполнении фазы сборки мы выполняем все цели сборки в этой фазе сборки. Цели сборки назначаются одному или нескольким этапам сборки. Мы также можем выполнить цель сборки напрямую.
Существует три основных встроенных жизненных цикла сборки :
Например, defaultжизненный цикл состоит из следующих этапов сборки :
◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
Итак, чтобы пройти вышеупомянутые этапы, нам просто нужно вызвать одну команду:
mvn <phase> { Ex: mvn install }
Для вышеприведенной команды, начиная с первой фазы, все фазы выполняются последовательно до фазы установки. mvnможет выполнить цель или этап (или даже несколько целей или несколько этапов) следующим образом:
mvn clean install plugin:goal
Однако, если вы хотите настроить префикс, используемый для ссылки на ваш плагин, вы можете указать префикс непосредственно через параметр конфигурации в POMmaven-plugin-plugin вашего плагина.
Большая часть функциональности Maven находится в плагинах. Плагин предоставляет набор целей, которые могут быть выполнены с использованием следующего синтаксиса:
mvn [plugin-name]:[goal-name]
Например, проект Java может быть скомпилирован с целью компиляции плагина путем запуска mvn compiler:compile.
Жизненный цикл сборки - это список именованных фаз, которые можно использовать для определения порядка выполнения цели.
Цели, предоставляемые плагинами, могут быть связаны с различными фазами жизненного цикла. Например, по умолчанию цельcompiler:compile связана с compileфазой , а цельsurefire:test связана с testфазой . Рассмотрим следующую команду:
mvn test
Когда предыдущая команда выполнена, Maven выполняет все цели, связанные с каждым из этапов, вплоть до testэтапа. В таком случае Maven запускает resources:resourcesцель, связанную с process-resourcesфазой, затем compiler:compileи так далее, пока он, наконец, не выполнит surefire:testцель.
Однако, хотя этап сборки отвечает за конкретный этап жизненного цикла сборки, способ выполнения этих обязанностей может отличаться. И это делается путем объявления целей плагина, связанных с этими этапами сборки.
Цель плагина представляет собой конкретную задачу (более тонкую, чем фаза сборки), которая способствует созданию и управлению проектом. Он может быть привязан к нулю или большему количеству фаз сборки. Цель, не связанная с какой-либо фазой сборки, может быть выполнена вне жизненного цикла сборки путем прямого вызова. Порядок выполнения зависит от порядка, в котором вызываются цели и этапы сборки. Например, рассмотрим команду ниже. cleanИ packageаргументы фаза сборки, в то время как dependency:copy-dependenciesэто цель (из плагина).
mvn clean dependency:copy-dependencies package
Если это должно было cleanбыть выполнено, сначала будет выполняться фаза (то есть она будет запускать все предыдущие фазы чистого жизненного цикла, плюс сама cleanфаза), а затем dependency:copy-dependenciesцель, прежде чем, наконец, выполнить packageфазу (и все предшествующие фазы сборки жизненный цикл по умолчанию).
Более того, если цель связана с одним или несколькими этапами сборки, эта цель будет вызываться на всех этих этапах.
Кроме того, фаза сборки также может иметь ноль или более целей, связанных с ней. Если фаза сборки не связана с какими-либо целями, эта фаза сборки не будет выполнена. Но если с ним связана одна или несколько целей, он выполнит все эти цели.
Встроенные привязки жизненного цикла
Некоторые фазы имеют цели, связанные с ними по умолчанию. А для жизненного цикла по умолчанию эти привязки зависят от стоимости упаковки.
Если у меня есть 2 профиля, могу ли я запустить все плагины профиля 1, а затем - профиля 2?
Bee
[plugin-name]в примере mvn [plugin-name]:[goal-name]это скорее префикс плагина . mvn clean installможет не только « использоваться в многомодульном сценарии ». Мультимодуль - это совершенно другая тема.
GeroldBroser восстанавливает Монику
Соблюдаются ли цели, связанные с одной и той же фазой?
угорь ghEEz
5
Большая часть этого текста дословно скопирована из документации Maven . Это должно быть четко указано!
Лий
потрясающий источник!
Бобо
45
Выбранный ответ великолепен, но все же я хотел бы добавить что-то маленькое в тему. Иллюстрация
Это ясно демонстрирует, как различные фазы связаны с различными плагинами и цели, которые эти плагины раскрывают.
Итак, давайте рассмотрим случай запуска чего-то вроде mvn compile:
Это этап, на котором выполняется плагин компилятора с целью компиляции.
Плагин компилятора преследовал разные цели. Поскольку mvn compileэто сопоставлено с конкретной целью, целью компиляции.
Указатели от фаз до плагинов на диаграмме тоже не совсем верны, jarплагин фактически работает в packageфазе. И pom в сэндвиче между фазами и плагинами немного сбивает с толку (я предполагаю, что это должно означать, что в pom вы можете настроить, какие плагины запускаются в какие фазы, в дополнение к привязкам по умолчанию). Общий принцип, тем не менее, правильный.
Задача (действие), которая выполняется. Плагин может иметь одну или несколько целей.
При настройке плагина в POM необходимо указать одну или несколько целей . Кроме того, в случае, если плагин не имеет определенной фазы по умолчанию, указанные цели могут быть связаны с фазой.
Только фазы жизненного цикла имеют смысл рассматривать как «этапы» (процесса сборки). Я бы лучше назвал это 4 сущностями / предметами / вещами .
GeroldBroser восстанавливает Монику
Когда я вижу мир Build Phase, я думаю о нем как о другой фазе жизненного цикла, и это меня смущает.
Quazi Irfan
26
Я считаю, что хороший ответ уже предусмотрен, но я хотел бы добавить простую в последующую диаграмму различных 3 жизненных циклов ( build, cleanи site) и фаз в каждом.
Фазы, выделенные жирным шрифтом, - это основные фазы, которые обычно используются.
Короче говоря из ссылки, не следует пытаться понять все три сразу, сначала вы должны понять отношения в этих группах:
Жизненный цикл против фазы
Плагин против цели
1. Жизненный цикл против фазы
Жизненный цикл представляет собой последовательность фаз в последовательности, см. Здесь ссылки на жизненный цикл . Когда вы вызываете фазу , она также вызывает всю фазу до нее.
Например, чистый жизненный цикл состоит из 3 этапов ( предварительная очистка, очистка, последующая очистка ).
mvn clean
Будем называть предварительно чистыми и чистыми .
2. Плагин против цели
Цель похожа на действие в плагине . Так что, если плагин - это класс, цель - это метод.
Вы можете назвать цель как это:
mvn clean:clean
Это означает «назовите чистую цель, в чистом плагине» (здесь ничего не относится к чистой фазе. Не позволяйте слову «очистить» сбить вас с толку, они не совпадают!)
3. Теперь связь между этапом и целью:
Фаза может (предварительно) связываться с Целями. Например, обычно чистая фаза связана с чистой целью. Итак, когда вы вызываете эту команду:
mvn clean
Это вызовет фазу предварительной очистки и фазы очистки, которая связана с целью очистки: очистки.
Ответы:
Цели выполняются поэтапно, что помогает определить, в каком порядке выполняются цели заказа. Лучшее понимание этого состоит в том, чтобы взглянуть на привязки жизненного цикла Maven по умолчанию, которые показывают, какие цели выполняются в какие фазы по умолчанию. Цели этапа компиляции всегда выполняются до целей этапа тестирования, которые всегда выполняются до целей этапа пакета и так далее.
Частично путаница усугубляется тем фактом, что при выполнении maven вы можете указать цель или этап. Если вы укажете фазу, то maven будет запускать все фазы до фазы, указанной вами в указанном порядке (например, если вы укажете пакет, он сначала пройдет фазу компиляции, а затем фазу тестирования и, наконец, фазу пакета), и для каждой фазы будет выполнить все цели, связанные с этим этапом.
Когда вы создаете выполнение плагина в своем файле сборки Maven и указываете только цель, она будет привязана к данной фазе по умолчанию. Например, цель jaxb: xjc по умолчанию связывается с фазой создания ресурсов. Однако, когда вы указываете выполнение, вы также можете явно указать этап для этой цели.
Если вы зададите цель при выполнении Maven, он будет выполнять эту цель и только эту цель. Другими словами, если вы укажете цель jar: jar, она будет запускать только цель jar: jar для упаковки вашего кода в jar. Если вы ранее не выполняли цель компиляции или подготовили свой скомпилированный код каким-либо другим способом, это может с большой вероятностью завершиться неудачей.
источник
mvn archetype:generate
Е. И в этом случае maven только выполняет цель?mvn test
run:, в--- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:test
то время какmvn compiler:testCompile
просто работает--- maven-compiler-plugin:3.1:testCompile ...
.mvn clean compiler:testCompile
запускается--- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile
с ошибкойFailed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhase
(гдеMvnPhase
находится тестируемый класс, на который есть ссылка в тестовом классе). Очевидно, фазы не вызываются, если цель вызывается явно.Maven основан на центральной концепции Build Life Cycles . Внутри каждого Строительство циклов жизни есть Строительный Phases , так и внутри каждое Строительство фаз есть Строительные цели .
Мы можем выполнить либо этап сборки, либо построить цель. При выполнении фазы сборки мы выполняем все цели сборки в этой фазе сборки. Цели сборки назначаются одному или нескольким этапам сборки. Мы также можем выполнить цель сборки напрямую.
Существует три основных встроенных жизненных цикла сборки :
Каждый жизненный цикл сборки состоит из фаз
Например,
default
жизненный цикл состоит из следующих этапов сборки :Итак, чтобы пройти вышеупомянутые этапы, нам просто нужно вызвать одну команду:
Для вышеприведенной команды, начиная с первой фазы, все фазы выполняются последовательно до фазы установки.
mvn
может выполнить цель или этап (или даже несколько целей или несколько этапов) следующим образом:Однако, если вы хотите настроить префикс, используемый для ссылки на ваш плагин, вы можете указать префикс непосредственно через параметр конфигурации в POM
maven-plugin-plugin
вашего плагина.Фаза сборки состоит из целей плагина
Большая часть функциональности Maven находится в плагинах. Плагин предоставляет набор целей, которые могут быть выполнены с использованием следующего синтаксиса:
Например, проект Java может быть скомпилирован с целью компиляции плагина путем запуска
mvn compiler:compile
.Жизненный цикл сборки - это список именованных фаз, которые можно использовать для определения порядка выполнения цели.
Цели, предоставляемые плагинами, могут быть связаны с различными фазами жизненного цикла. Например, по умолчанию цель
compiler:compile
связана сcompile
фазой , а цельsurefire:test
связана сtest
фазой . Рассмотрим следующую команду:Когда предыдущая команда выполнена, Maven выполняет все цели, связанные с каждым из этапов, вплоть до
test
этапа. В таком случае Maven запускаетresources:resources
цель, связанную сprocess-resources
фазой, затемcompiler:compile
и так далее, пока он, наконец, не выполнитsurefire:test
цель.Однако, хотя этап сборки отвечает за конкретный этап жизненного цикла сборки, способ выполнения этих обязанностей может отличаться. И это делается путем объявления целей плагина, связанных с этими этапами сборки.
Цель плагина представляет собой конкретную задачу (более тонкую, чем фаза сборки), которая способствует созданию и управлению проектом. Он может быть привязан к нулю или большему количеству фаз сборки. Цель, не связанная с какой-либо фазой сборки, может быть выполнена вне жизненного цикла сборки путем прямого вызова. Порядок выполнения зависит от порядка, в котором вызываются цели и этапы сборки. Например, рассмотрим команду ниже.
clean
Иpackage
аргументы фаза сборки, в то время какdependency:copy-dependencies
это цель (из плагина).Если это должно было
clean
быть выполнено, сначала будет выполняться фаза (то есть она будет запускать все предыдущие фазы чистого жизненного цикла, плюс самаclean
фаза), а затемdependency:copy-dependencies
цель, прежде чем, наконец, выполнитьpackage
фазу (и все предшествующие фазы сборки жизненный цикл по умолчанию).Более того, если цель связана с одним или несколькими этапами сборки, эта цель будет вызываться на всех этих этапах.
Кроме того, фаза сборки также может иметь ноль или более целей, связанных с ней. Если фаза сборки не связана с какими-либо целями, эта фаза сборки не будет выполнена. Но если с ним связана одна или несколько целей, он выполнит все эти цели.
Встроенные привязки жизненного цикла
Некоторые фазы имеют цели, связанные с ними по умолчанию. А для жизненного цикла по умолчанию эти привязки зависят от стоимости упаковки.
Maven Архитектура:
Ссылка 1
Ссылка 2
Пример Eclipse для Maven Lifecycle Mapping
источник
[plugin-name]
в примереmvn [plugin-name]:[goal-name]
это скорее префикс плагина .mvn clean install
может не только « использоваться в многомодульном сценарии ». Мультимодуль - это совершенно другая тема.Выбранный ответ великолепен, но все же я хотел бы добавить что-то маленькое в тему. Иллюстрация
Это ясно демонстрирует, как различные фазы связаны с различными плагинами и цели, которые эти плагины раскрывают.
Итак, давайте рассмотрим случай запуска чего-то вроде
mvn compile
:mvn compile
это сопоставлено с конкретной целью, целью компиляции.mvn compiler:compile
Таким образом, фаза состоит из целей плагина .
Ссылка на ссылку
источник
mvn test
указывает наpackage
иmvn install
указывает наdeploy
?jar
плагин фактически работает вpackage
фазе. И pom в сэндвиче между фазами и плагинами немного сбивает с толку (я предполагаю, что это должно означать, что в pom вы можете настроить, какие плагины запускаются в какие фазы, в дополнение к привязкам по умолчанию). Общий принцип, тем не менее, правильный.Определения подробно описаны на странице сайта Maven. Введение в жизненный цикл сборки , но я попытался подвести итог :
Maven определяет 4 элемента процесса сборки:
Жизненный цикл
Три встроенных в жизненном цикле (ака строит жизненный цикл ):
default
,clean
,site
. ( Ссылка на жизненный цикл )фаза
Каждый жизненный цикл состоит из этапов , например , для
default
жизненного цикла:compile
,test
,package
,install
и т.д.Plugin
Артефакт, который обеспечивает одну или несколько целей.
В зависимости от типа упаковки (
jar
,war
и т. Д.) Цели плагинов по умолчанию привязаны к этапам. ( Встроенные привязки жизненного цикла )Цель
Задача (действие), которая выполняется. Плагин может иметь одну или несколько целей.
При настройке плагина в POM необходимо указать одну или несколько целей . Кроме того, в случае, если плагин не имеет определенной фазы по умолчанию, указанные цели могут быть связаны с фазой.
Maven может быть вызван с:
clean
,package
)<plugin-prefix>:<goal>
(напримерdependency:copy-dependencies
)<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
(напримерorg.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
)с одной или несколькими комбинациями любого или всех, например:
источник
Build Phase
, я думаю о нем как о другой фазе жизненного цикла, и это меня смущает.Я считаю, что хороший ответ уже предусмотрен, но я хотел бы добавить простую в последующую диаграмму различных 3 жизненных циклов (
build
,clean
иsite
) и фаз в каждом.Фазы, выделенные жирным шрифтом, - это основные фазы, которые обычно используются.
источник
generate-resources
появляется дважды иgenerate-sources
отсутствует.Отдайте должное Сандипу Джиндалу и Премраю. Их объяснение помогает мне понять после некоторого замешательства.
Я создал несколько примеров полного кода и несколько простых объяснений здесь https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Я думаю, что это может помочь другим понять.
Короче говоря из ссылки, не следует пытаться понять все три сразу, сначала вы должны понять отношения в этих группах:
1. Жизненный цикл против фазы
Жизненный цикл представляет собой последовательность фаз в последовательности, см. Здесь ссылки на жизненный цикл . Когда вы вызываете фазу , она также вызывает всю фазу до нее.
Например, чистый жизненный цикл состоит из 3 этапов ( предварительная очистка, очистка, последующая очистка ).
Будем называть предварительно чистыми и чистыми .
2. Плагин против цели
Цель похожа на действие в плагине . Так что, если плагин - это класс, цель - это метод.
Вы можете назвать цель как это:
Это означает «назовите чистую цель, в чистом плагине» (здесь ничего не относится к чистой фазе. Не позволяйте слову «очистить» сбить вас с толку, они не совпадают!)
3. Теперь связь между этапом и целью:
Фаза может (предварительно) связываться с Целями. Например, обычно чистая фаза связана с чистой целью. Итак, когда вы вызываете эту команду:
Это вызовет фазу предварительной очистки и фазы очистки, которая связана с целью очистки: очистки.
Это почти так же, как:
Более подробно и полные примеры в https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/
источник
Рабочая терминология Maven, имеющая фазы и цели.
Фаза: фаза Maven - это набор действий, который связан с 2 или 3 целями
пример: - если вы запустите mvn clean
это фаза выполнит цель mvn clean: clean
Цель: цель Maven, ограниченная фазой
для справки http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
источник
Существует три встроенных жизненных цикла сборки:
Жизненный цикл по умолчанию -> [проверять, инициализировать, генерировать-источники, обрабатывать-источники, генерировать-ресурсы, обрабатывать-ресурсы, компилировать, классы-процессы, генерировать-тестировать-источники, обрабатывать-тестировать-источники, генерировать-тестировать-ресурсы, обрабатывать -test-resources, test-compile, process-test-classes, test, prepare-package, package, предварительный интеграционный тест, интеграционный тест, постинтеграционный тест, проверка, установка, развертывание]
Чистый жизненный цикл -> [предварительная очистка, очистка, последующая очистка]
Сайт жизненного цикла -> [pre-site, site, post-site, site-deploy]
Поток является последовательным, например, для жизненного цикла по умолчанию , он начинается с проверки , затем инициализации и так далее ...
Вы можете проверить жизненный цикл, включив режим отладки,
mvn
т.е.mvn -X <your_goal>
источник