Сборочный цикл в Maven

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

Цикл сборки

Цикл по умолчанию (default), цикл сборки, состоит из двадцати трёх (sic!) шагов, называемых фазами (phase), из которых явно используются обычно только 7 фаз сборки:

  • validate — в этой фазе проверяется корректность проекта и обеспечивается доступность необходимых зависимостей
  • compile — Компилируется исходный код проекта
  • test — Код тестов компилируется и запускаются unit тесты
  • package — Скомпилированный код собирается в пакет (jar/war/ear/etc)
  • verify — Запускаются интеграционные тесты
  • install — Собранный ранее пакет устанавливается в локальный репозиторий и становится доступен для сборки других локальных проектов
  • deploy — Пакет публикуется в удалённых репозиториях, устанавливается на серверы приложений и так далее

Порядок фаз выше важен, так как каждая фаза зависит от предыдущей. Любая из этих фаз может быть вызвана вручную указанием имени фазы в командной строке maven:

При этом надо понимать, что вызывая какую-либо фазу, вы так же инициируете выполнение предыдущих фаз. То есть вызывая maven package вы фактически требуете исполнить фазы validate, compile, test, package и именно в таком порядке.

Для тех, кому интересно, я приведу полный список фаз:

23 фазы сборки
  • validate в этой фазе проверяется корректность проекта и обеспечивается доступность необходимых зависимостей
  • initialize — Подготавливается окружение сборки, вычисляются значения переменных, создаются необходимые директории и так далее
  • generate-sources — Генерируется исходный код для компиляции с кодом проекта
  • process-sources — Исходный код проекта (включая сгенерированный ранее) обрабатывается перед компиляцией
  • generate-resources — Генерируются ресурсы проекта
  • process-resources — Ресурсы проекта (включая сгенерированные) обрабатываются перед компиляцией
  • compile — Компилируется исходный код проект
  • process-classes — Скомпилированные классы дополнительно обрабатываются.
  • generate-test-sources — Генерируется исходный код для компиляции совместно с тестами
  • process-test-sources — Исходный код тестов (включая сгенерированный ранее) обрабатывается перед компиляцией тестов
  • generate-test-resources — Генерируются тестовые ресурсы проекта
  • process-test-resources- Тестовые ресурсы проекта (включая сгенерированные) обрабатываются перед компиляцией тестов
  • test-compile — Компилируется исходный код тестов
  • process-test-classes — Скомпилированные классы тестов дополнительно обрабатываются.
  • test Запускаются unit тесты
  • prepare-package — Выполняются процедуры по подготовке к упаковке в пакет. Обычно в этой фазе полностью формируется содержимое будущего пакета
  • package — Скомпилированный код собирается в пакет (jar/war/ear/etc)
  • pre-integration-test — Подготовка окружения к запуску интеграционных тестов
  • integration-test — Выполнение интеграционных тестов
  • post-integration-test — Очистка окружения после интеграционных тестов
  • verify Проверка результатов исполнения интеграционных тестов
  • install — Собранный ранее пакет устанавливается в локальный репозиторий и становится доступен для сборки других локальных проектов
  • deploy — Пакет публикуется в удалённых репозиториях, устанавливается на серверы приложений и так далее
[свернуть]
Вызывать вручную можно все фазы, но, обычно, фазы с ‘-‘ в названии не принято вызывать явно, так как они могут оставить сборку в неоконченном виде. Например, вызвав integration-test вместо verify вы останетесь с неубранным мусором от интеграционных тестов.

Что выполняют фазы?

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

Maven поставляется с некоторым количеством плагинов (а ещё несметное множество плагинов ждёт вас в интернете) и каждый плагин решает ту или иную задачу: плагин compiler компилирует код, плагин resources управляет ресурсами и так далее. У каждого плагина есть одна или несколько целей (goal) И так же как и с фазами цикла сборки, можно вызывать цели плагинов напрямую, передавая их в коммандной строке maven:

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

Как вы уже наверное могли понять, всю настоящую работу выполняют те плагины, цели (goal) которых привязаны к фазам сборочного цикла.

Есть два метода связывания целей и фаз. Можно каждому плагину указать явно, какая его цель должна исполнятся в какой фазе:

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

Второй метод, используемый по умолчанию в maven, это настройка путём указания тега <packaging/>

Наиболее часто для этого тега используются значения jar, war, ear, pom. Если тег опущен, будет использовано знаение по умолчанию: jar В зависимости от значения тега <packaging/> maven сам свяжет фазы сборки и цели плагинов. Например для jar будут созданые следующие связи:

process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar
install install:install
deploy deploy:deploy

Для разных packaging связи будут разные.

Три цикла сборки

На самом делев maven не один цикл сборки , а целых три. Описанный выше цикл, известный как цикл по умолчанию, не имеет никакого особого имени и используется для сборки проекта.

Ещё один цикл, clean, содержит всего одну цель, clean, которая привязана к цели clean плагина clean 🙂 Выполнение этой фазы очищает проект от всего того, что оставляют после себя остальные фазы.

Наконец, цикл site служит для генерации сайта проекта из maven и состоит из четырёх целей:

  • pre-site — Подготовка к генерации сайта
  • site — Непосредственно генерация сайта
  • post-site — Подготовка к публикации сайта
  • site-deploy — Публикация сайта

Код примера может быть сгенерирован командой