В чем разница / отношение между целями и фазами Maven? Как они связаны друг с другом?
В чем разница / отношение между целями и фазами Maven? Как они связаны друг с другом?
Ответы:
Цели выполняются поэтапно, что помогает определить, в каком порядке выполняются цели заказа. Лучшее понимание этого состоит в том, чтобы взглянуть на привязки жизненного цикла 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
находится тестируемый класс, на который есть ссылка в тестовом классе). Очевидно, фазы не вызываются, если цель вызывается явно.
Жизненный цикл - это последовательность названных фаз .
Этапы выполняются последовательно. Выполнение фазы означает выполнение всех предыдущих фаз.Плагин представляет собой набор целей, также называемых 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
фазу (и все предшествующие фазы сборки жизненный цикл по умолчанию).
Более того, если цель связана с одним или несколькими этапами сборки, эта цель будет вызываться на всех этих этапах.
Кроме того, фаза сборки также может иметь ноль или более целей, связанных с ней. Если фаза сборки не связана с какими-либо целями, эта фаза сборки не будет выполнена. Но если с ним связана одна или несколько целей, он выполнит все эти цели.
Встроенные привязки жизненного цикла
Некоторые фазы имеют цели, связанные с ними по умолчанию. А для жизненного цикла по умолчанию эти привязки зависят от стоимости упаковки.
Maven Архитектура:
Пример 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
)с одной или несколькими комбинациями любого или всех, например:
mvn clean dependency:copy-dependencies package
Build Phase
, я думаю о нем как о другой фазе жизненного цикла, и это меня смущает.
Я считаю, что хороший ответ уже предусмотрен, но я хотел бы добавить простую в последующую диаграмму различных 3 жизненных циклов ( build
, clean
и site
) и фаз в каждом.
Фазы, выделенные жирным шрифтом, - это основные фазы, которые обычно используются.
generate-resources
появляется дважды и generate-sources
отсутствует.
Отдайте должное Сандипу Джиндалу и Премраю. Их объяснение помогает мне понять после некоторого замешательства.
Я создал несколько примеров полного кода и несколько простых объяснений здесь 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/
Рабочая терминология 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>