Какие ключевые фазы есть в Maven
Что проверяют
Понимаете ли вы, что Maven это не набор команд, а жизненный цикл с фиксированным порядком фаз, к которым привязаны цели плагинов. Спрашивают, чтобы выйти на практику: что запускает CI и почему сборка не видит свежий соседний модуль. Следом обычно просят объяснить разницу между mvn package и mvn install.
Как отвечать
Скажите сразу, что жизненных циклов три: clean, default и site. Основные фазы default:
- validate: проект корректен, всё необходимое на месте;
- compile: исходники в байт-код через
maven-compiler-plugin; - test: юнит-тесты через Surefire, по умолчанию классы вида
*Test; - package: артефакт (JAR, WAR) собирается в
target; - verify: интеграционные проверки, обычно Failsafe с классами
*IT, плюс проверки качества; - install: артефакт кладётся в локальный репозиторий
~/.m2/repository; - deploy: артефакт публикуется в удалённый репозиторий, Nexus или Artifactory.
Дальше то, ради чего задавали вопрос. Вызов фазы выполняет все предыдущие фазы своего цикла, поэтому mvn verify уже включает компиляцию и тесты. Сами фазы ничего не делают, работу выполняют цели плагинов, привязанные к фазам, а набор привязок по умолчанию задаёт packaging (jar, war, pom). mvn clean install это две команды из разных циклов подряд. Добавьте про -DskipTests (тесты компилируются, но не запускаются) против -Dmaven.test.skip=true (не компилируются вовсе) и про то, что в CI обычно достаточно mvn verify, а install нужен, когда соседний модуль берёт артефакт из локального репозитория.
Где спотыкаются
Считают clean фазой цикла default. Это отдельный жизненный цикл, поэтому его и пишут явно перед целью.
Думают, что mvn package тесты не гоняет. Гоняет: фаза test идёт раньше package.
Путают фазу и цель. mvn compile это фаза, mvn compiler:compile вызов конкретной цели плагина в обход цикла, и результат у них разный.