Как реализовать разные профили сборки в Maven
Что проверяют
Знаете ли вы профили глубже, чем флаг -P: где они объявляются, как включаются и что умеют менять. Следом почти всегда спрашивают, чем профиль Maven отличается от профиля Spring и стоит ли собирать отдельный артефакт под каждое окружение.
Как отвечать
Профиль это именованный набор переопределений POM, который включается по условию. Объявляется в pom.xml внутри <profiles> или в ~/.m2/settings.xml, если настройка личная. Внутри профиля переопределяются <properties>, <dependencies>, <build><plugins>, <modules>, <repositories>.
Способы активации:
- явно:
mvn package -Pdev, несколько через запятую, отключение через-P !prodили-P -prod; - по умолчанию:
<activeByDefault>true</activeByDefault>, работает, пока в этом POM явно не включён ни один другой профиль; - по свойству: блок
<property>в<activation>включает профиль, например, при-Denv=ci; - по окружению:
<jdk>,<os>, наличие или отсутствие файла через<file><exists>.
Типичный сценарий: в профиле лежит свойство, ресурсы собираются с <filtering>true</filtering>, и плейсхолдер в application.properties подставляется при сборке. В проектах на spring-boot-starter-parent он пишется как @db.url@, а не ${db.url}. Для отладки назовите mvn help:active-profiles (что включилось) и mvn help:effective-pom (итоговый POM после слияния).
Закончите оговоркой: профили хороши для вариантов сборки (быстрая без тестов, с интеграционными тестами, нативный образ), а конфигурацию окружения лучше отдавать в рантайм через переменные окружения или spring.profiles.active. Тогда один и тот же проверенный артефакт едет и на тест, и в прод.
Где спотыкаются
Путают профили Maven и профили Spring. Первые работают при сборке, вторые при запуске, и -Pprod сам по себе не включает spring.profiles.active=prod.
Не знают подвоха activeByDefault: стоит явно включить любой другой профиль, и профиль по умолчанию молча отключается вместе со своими свойствами.
Кладут в профиль пароли от продовой базы и собирают отдельный jar под каждое окружение. В прод уходит не тот артефакт, что прошёл тесты, а секреты оседают в репозитории.