Каковы цели и этапы Maven и в чем их отличие?

329

В чем разница / отношение между целями и фазами Maven? Как они связаны друг с другом?

Тарун Кумар
источник

Ответы:

251

Цели выполняются поэтапно, что помогает определить, в каком порядке выполняются цели заказа. Лучшее понимание этого состоит в том, чтобы взглянуть на привязки жизненного цикла Maven по умолчанию, которые показывают, какие цели выполняются в какие фазы по умолчанию. Цели этапа компиляции всегда выполняются до целей этапа тестирования, которые всегда выполняются до целей этапа пакета и так далее.

Частично путаница усугубляется тем фактом, что при выполнении maven вы можете указать цель или этап. Если вы укажете фазу, то maven будет запускать все фазы до фазы, указанной вами в указанном порядке (например, если вы укажете пакет, он сначала пройдет фазу компиляции, а затем фазу тестирования и, наконец, фазу пакета), и для каждой фазы будет выполнить все цели, связанные с этим этапом.

Когда вы создаете выполнение плагина в своем файле сборки Maven и указываете только цель, она будет привязана к данной фазе по умолчанию. Например, цель jaxb: xjc по умолчанию связывается с фазой создания ресурсов. Однако, когда вы указываете выполнение, вы также можете явно указать этап для этой цели.

Если вы зададите цель при выполнении Maven, он будет выполнять эту цель и только эту цель. Другими словами, если вы укажете цель jar: jar, она будет запускать только цель jar: jar для упаковки вашего кода в jar. Если вы ранее не выполняли цель компиляции или подготовили свой скомпилированный код каким-либо другим способом, это может с большой вероятностью завершиться неудачей.

аллюр
источник
11
У меня есть привычка говорить «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 , так и внутри каждое Строительство фаз есть Строительные цели .

Мы можем выполнить либо этап сборки, либо построить цель. При выполнении фазы сборки мы выполняем все цели сборки в этой фазе сборки. Цели сборки назначаются одному или нескольким этапам сборки. Мы также можем выполнить цель сборки напрямую.

Существует три основных встроенных жизненных цикла сборки :

  1. дефолт
  2. чистый
  3. сайт

Каждый жизненный цикл сборки состоит из фаз

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

Более того, если цель связана с одним или несколькими этапами сборки, эта цель будет вызываться на всех этих этапах.

Кроме того, фаза сборки также может иметь ноль или более целей, связанных с ней. Если фаза сборки не связана с какими-либо целями, эта фаза сборки не будет выполнена. Но если с ним связана одна или несколько целей, он выполнит все эти цели.

Встроенные привязки жизненного цикла
Некоторые фазы имеют цели, связанные с ними по умолчанию. А для жизненного цикла по умолчанию эти привязки зависят от стоимости упаковки.

Maven Архитектура:

введите описание изображения здесь

Ссылка 1
Ссылка 2

Пример Eclipse для Maven Lifecycle Mapping

Пример Eclipse для Maven Lifecycle Mapping

Premraj
источник
Если у меня есть 2 профиля, могу ли я запустить все плагины профиля 1, а затем - профиля 2?
Bee
[plugin-name]в примере mvn [plugin-name]:[goal-name]это скорее префикс плагина . mvn clean installможет не только « использоваться в многомодульном сценарии ». Мультимодуль - это совершенно другая тема.
GeroldBroser восстанавливает Монику
Соблюдаются ли цели, связанные с одной и той же фазой?
угорь ghEEz
5
Большая часть этого текста дословно скопирована из документации Maven . Это должно быть четко указано!
Лий
потрясающий источник!
Бобо
45

Выбранный ответ великолепен, но все же я хотел бы добавить что-то маленькое в тему. Иллюстрация

Это ясно демонстрирует, как различные фазы связаны с различными плагинами и цели, которые эти плагины раскрывают.

Итак, давайте рассмотрим случай запуска чего-то вроде mvn compile:

  • Это этап, на котором выполняется плагин компилятора с целью компиляции.
  • Плагин компилятора преследовал разные цели. Поскольку mvn compileэто сопоставлено с конкретной целью, целью компиляции.
  • Это так же, как бег mvn compiler:compile

Таким образом, фаза состоит из целей плагина .

введите описание изображения здесь

Ссылка на ссылку

Джонни
источник
20
почему mvn testуказывает на packageи mvn installуказывает на deploy?
Абдул
2
Похоже, ошибка иллюстрации, спасибо, что заметили (нашел его в Интернете).
Джонни
3
Откуда вы взяли иллюстрацию? Вы проверяли авторские права и условия использования?
Абдул
1
@ Abdull изображение взято отсюда carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/… (и оно также появляется на многих других веб-страницах), добавляя его к ответу. Спасибо за поднятие этого вопроса, не знал о важности этого.
Джонни
1
Указатели от фаз до плагинов на диаграмме тоже не совсем верны, jarплагин фактически работает в packageфазе. И pom в сэндвиче между фазами и плагинами немного сбивает с толку (я предполагаю, что это должно означать, что в pom вы можете настроить, какие плагины запускаются в какие фазы, в дополнение к привязкам по умолчанию). Общий принцип, тем не менее, правильный.
Александр Климетчек
43

Определения подробно описаны на странице сайта Maven. Введение в жизненный цикл сборки , но я попытался подвести итог :

Maven определяет 4 элемента процесса сборки:

  1. Жизненный цикл

    Три встроенных в жизненном цикле (ака строит жизненный цикл ): default, clean, site. ( Ссылка на жизненный цикл )

  2. фаза

    Каждый жизненный цикл состоит из этапов , например , для defaultжизненного цикла: compile, test, package, installи т.д.

  3. Plugin

    Артефакт, который обеспечивает одну или несколько целей.

    В зависимости от типа упаковки ( jar, warи т. Д.) Цели плагинов по умолчанию привязаны к этапам. ( Встроенные привязки жизненного цикла )

  4. Цель

    Задача (действие), которая выполняется. Плагин может иметь одну или несколько целей.

    При настройке плагина в POM необходимо указать одну или несколько целей . Кроме того, в случае, если плагин не имеет определенной фазы по умолчанию, указанные цели могут быть связаны с фазой.

Maven может быть вызван с:

  1. фаза (например clean, package)
  2. <plugin-prefix>:<goal>(например dependency:copy-dependencies)
  3. <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>(например org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile)

с одной или несколькими комбинациями любого или всех, например:

mvn clean dependency:copy-dependencies package
Сандип Джиндал
источник
Только фазы жизненного цикла имеют смысл рассматривать как «этапы» (процесса сборки). Я бы лучше назвал это 4 сущностями / предметами / вещами .
GeroldBroser восстанавливает Монику
Когда я вижу мир Build Phase, я думаю о нем как о другой фазе жизненного цикла, и это меня смущает.
Quazi Irfan
26

Я считаю, что хороший ответ уже предусмотрен, но я хотел бы добавить простую в последующую диаграмму различных 3 жизненных циклов ( build, cleanи site) и фаз в каждом.

введите описание изображения здесь

Фазы, выделенные жирным шрифтом, - это основные фазы, которые обычно используются.

Лиор Бар-Он
источник
2
generate-resourcesпоявляется дважды и generate-sourcesотсутствует.
elingerojo
12

Отдайте должное Сандипу Джиндалу и Премраю. Их объяснение помогает мне понять после некоторого замешательства.

Я создал несколько примеров полного кода и несколько простых объяснений здесь 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

Более подробно и полные примеры в https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/

Surasin Tancharoen
источник
2

Рабочая терминология Maven, имеющая фазы и цели.

Фаза: фаза Maven - это набор действий, который связан с 2 или 3 целями

пример: - если вы запустите mvn clean

это фаза выполнит цель mvn clean: clean

Цель: цель Maven, ограниченная фазой

для справки http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html

Венки Вунгарала
источник
4
Это не обязательно должно быть «связано с 2 или 3 целями» . Это может быть ни один , один или более трех , а также.
GeroldBroser восстанавливает Монику
1

Существует три встроенных жизненных цикла сборки:

  • дефолт
  • чистый
  • сайт

Жизненный цикл по умолчанию -> [проверять, инициализировать, генерировать-источники, обрабатывать-источники, генерировать-ресурсы, обрабатывать-ресурсы, компилировать, классы-процессы, генерировать-тестировать-источники, обрабатывать-тестировать-источники, генерировать-тестировать-ресурсы, обрабатывать -test-resources, test-compile, process-test-classes, test, prepare-package, package, предварительный интеграционный тест, интеграционный тест, постинтеграционный тест, проверка, установка, развертывание]

Чистый жизненный цикл -> [предварительная очистка, очистка, последующая очистка]

Сайт жизненного цикла -> [pre-site, site, post-site, site-deploy]

Поток является последовательным, например, для жизненного цикла по умолчанию , он начинается с проверки , затем инициализации и так далее ...

Вы можете проверить жизненный цикл, включив режим отладки, mvnт.е.mvn -X <your_goal>

Vishrant
источник