Каковы цели и этапы Maven и в чем их отличие?
В чем разница / отношение между целями и фазами Maven? Как они связаны друг с другом?
9 ответов
Цели выполняются поэтапно, что помогает определить, в каком порядке выполняются цели заказа. Лучшее понимание этого состоит в том, чтобы взглянуть на привязки жизненного цикла Maven по умолчанию, которые показывают, какие цели выполняются в какие фазы по умолчанию. Цели этапа компиляции всегда выполняются до целей этапа тестирования, которые всегда выполняются до целей этапа пакета и так далее.
Частично путаница усугубляется тем фактом, что при выполнении maven вы можете указать цель или этап. Если вы укажете фазу, то maven будет запускать все фазы до фазы, указанной вами в указанном порядке (например, если вы укажете пакет, он сначала будет проходить через фазу компиляции, а затем фазу тестирования и, наконец, фазу пакета), и для каждой фазы это будет запустить все цели, связанные с этим этапом.
Когда вы создаете выполнение плагина в своем файле сборки Maven и указываете только цель, она будет привязана к данной фазе по умолчанию. Например, цель jaxb: xjc по умолчанию связывается с фазой создания ресурсов. Однако, когда вы указываете выполнение, вы также можете явно указать этап для этой цели.
Если вы зададите цель при выполнении Maven, она все равно будет проходить все фазы вплоть до фазы для этой цели. Другими словами, если вы укажете цель jar, она запустит все фазы вплоть до фазы пакета (и все цели в этих фазах), а затем запустит цель jar.
Жизненный цикл - это последовательность названных фаз.
Этапы выполняются последовательно. Выполнение фазы означает выполнение всех предыдущих фаз.Плагин представляет собой набор целей, также называемых MOJO (M aven O ld J ava O bject).
Аналогия: плагин - это класс, а цели - это методы внутри класса.
Maven основан на центральной концепции жизненного цикла сборки.
Существует три встроенных жизненных цикла сборки:
- дефолт
- чистый
- сайт
Каждый жизненный цикл сборки состоит из фаз
Например, 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
Однако, если вы хотите настроить префикс, используемый для ссылки на ваш плагин, вы можете указать префикс непосредственно через параметр конфигурации в maven-plugin-plugin
в POM вашего плагина.
Фаза сборки состоит из целей плагина
Большая часть функциональности 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 Архитектура:
Определения подробно описаны на странице сайта 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
)
с одной или несколькими комбинациями любого или всех, например:
mvn clean dependency:copy-dependencies package
Выбранный ответ великолепен, но все же я хотел бы добавить что-то маленькое в тему. Иллюстрация
Это ясно демонстрирует, как различные фазы связаны с различными плагинами и цели, которые представляют эти плагины.
Итак, давайте рассмотрим случай запуска что-то вроде mvn compile
:
- Это этап, на котором выполняется плагин компилятора с целью компиляции.
- Плагин компилятора преследовал разные цели. За
mvn compile
это сопоставлено с конкретной целью, целью компиляции. - Это так же, как бег
mvn compiler:compile
Таким образом, фаза состоит из целей плагина.
Ссылка на ссылку
Я считаю, что хороший ответ уже предоставлен, но я хотел бы добавить простую для понимания диаграмму различных трех жизненных циклов (build
, clean
, а также site
) и фазы в каждом.
Фазы, выделенные жирным шрифтом, - это основные фазы, которые обычно используются.
Отдайте должное Сандипу Джиндалу и Премраю. Их объяснение помогает мне понять после некоторого замешательства.
Я создал несколько полных примеров кода и несколько простых пояснений здесь 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/
Существует три встроенных жизненных цикла сборки:
- дефолт
- чистый
- сайт
Жизненный цикл по умолчанию -> [проверять, инициализировать, генерировать-источники, источники-процессы, генерировать-ресурсы, ресурсы-процессы, компилировать, классы-процессы, генерировать-тестировать-источники, обрабатывать-проверять-источники, генерировать-тестировать-ресурсы, обрабатывать -test-resources, test-compile, process-test-classes, test, prepare-package, package, предварительный интеграционный тест, интеграционный тест, постинтеграционный тест, проверка, установка, развертывание]
Чистый жизненный цикл -> [предварительная очистка, очистка, последующая очистка]
Сайт жизненного цикла -> [pre-site, site, post-site, site-deploy]
Поток является последовательным, например, для жизненного цикла по умолчанию, он начинается с проверки, затем инициализации и так далее...
Вы можете проверить жизненный цикл, включив режим отладки: mvn
т.е. mvn -X <your_goal>
Что касается ответа Пейса ,
Если вы укажете цель при выполнении Maven, она будет выполнять эту цель и только эту цель. Другими словами, если вы укажете цель jar:jar, будет запущена только цель jar:jar, чтобы упаковать ваш код в банку.
есть исключение из этого утверждения. API-интерфейс Maven Plugin позволяет цели инициировать выполнение фазы жизненного цикла.
Рассмотрим следующий проект:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>simple-maven-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>
Когда вы выполняете цельrun
определено вspring-boot-maven-plugin
mvn org.springframework.boot:spring-boot-maven-plugin:run
он печатает
[INFO] ------------------< org.example:simple-maven-project >------------------
[INFO] Building simple-maven-project 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:3.0.0:run (default-cli) > test-compile @ simple-maven-project >>>
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ simple-maven-project ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Users\Bartosz\IdeaProjects\simple-maven-project\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ simple-maven-project ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ simple-maven-project ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\Users\Bartosz\IdeaProjects\simple-maven-project\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ simple-maven-project ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] <<< spring-boot-maven-plugin:3.0.0:run (default-cli) < test-compile @ simple-maven-project <<<
[INFO]
[INFO]
[INFO] --- spring-boot-maven-plugin:3.0.0:run (default-cli) @ simple-maven-project ---
[INFO] ------------------------------------------------------------------------
Это связано с тем, что определение цели в spring-boot-maven-plugin-XXXjar/META-INF/maven/plugin.xml содержит<executePhase>test-compile</executePhase>
, который выполняет тестовую компиляцию и все предыдущие фазы.
<mojo>
<goal>run</goal>
(...)
<executePhase>test-compile</executePhase>
(...)
</mojo>
Более того, из-за привязок по умолчанию для упаковки «jar» выполняется несколько других целей. Если упаковка изменена на "pom", та же самая команда приводит к
[INFO] ------------------< org.example:simple-maven-project >------------------
[INFO] Building simple-maven-project 1.0-SNAPSHOT
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:3.0.0:run (default-cli) > test-compile @ simple-maven-project >>>
[INFO]
[INFO] <<< spring-boot-maven-plugin:3.0.0:run (default-cli) < test-compile @ simple-maven-project <<<
[INFO]
[INFO]
[INFO] --- spring-boot-maven-plugin:3.0.0:run (default-cli) @ simple-maven-project ---
[INFO] ------------------------------------------------------------------------
потому что нет привязок по умолчанию для тестовой компиляции или любой предыдущей фазы и этого типа упаковки.
Рабочая терминология Maven, имеющая фазы и цели.
Фаза: фаза Maven - это набор действий, который связан с 2 или 3 целями.
пример: - если вы запустите mvn clean
это фаза выполнит цель mvn clean: clean
Цель: цель Maven, ограниченная фазой
для справки http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html