pom.xml и dependency management

Тема дорожной карты · Java

pom.xml Maven (Project Object Model) — это декларативный XML-конфигурационный файл в основе каждого Apache Maven-проекта, определяющий идентичность проекта, зависимости, плагины сборки, профили и настройки жизненного цикла в едином версионированном артефакте. Каждый pom.xml содержит обязательную GAV-координату <groupId>, <artifactId> и <version>, уникально идентифицирующую артефакт в Maven Central или частном репозитории Nexus/Artifactory, и опционально наследует от родительского POM, такого как spring-boot-starter-parent, для получения управляемых версий зависимостей Spring, Hibernate, JUnit 5, Mockito, Testcontainers и других распространённых Java-библиотек. Секция <dependencies> объявляет записи compile, runtime, test и provided-scope classpath, разрешаемые транзитивно движком разрешения зависимостей Maven, тогда как <dependencyManagement> в родительском pom.xml обеспечивает единые версии в многомодульных проектах без повторения номеров версий в каждом дочернем модуле. Плагины сборки, настроенные в <build><plugins> — такие как maven-compiler-plugin (нацеленный на JDK 21), maven-surefire-plugin (запускающий тесты JUnit 5) и spring-boot-maven-plugin (упаковывающий fat JARs) — это механизм, через который Apache Maven расширяется за рамки базовой компиляции и упаковки. Владение структурой pom.xml Maven обязательно для управления конфликтами зависимостей, конфигурирования многомодульных JDK-проектов и интеграции шагов сборки — генерации кода, статического анализа (Checkstyle, SpotBugs) и контейнеризации — в воспроизводимый CI/CD-конвейер.

Как это работает

pom.xml и dependency management — это Maven (самый популярный, XML-based pom.xml) или Gradle (Groovy/Kotlin DSL, быстрее, гибче). Оба управляют зависимостями (Maven Central — канонический репо), компилируют, гонят тесты, пакетируют JAR / WAR, публикуют в репо. Wrapper-скрипты (mvnw, gradlew) обеспечивают использование запинненной версии. Multi-module проекты + Bill of Materials (BOM) — для выравнивания версий между модулями.

Когда применять

Maven — если команда ценит конвенцию + стабильность; Gradle — для больших multi-module сборок, где Maven медленный. Всегда wrapper (mvnw / gradlew); не полагайтесь на глобальный Maven/Gradle. Пиннинг версий; dependency-check / OWASP-плагин — для выявления CVE. mvn dependency:tree / gradle dependencies периодически — для замечания дрейфа версий.

Типичные ошибки

Ловушки pom.xml и dependency management: SNAPSHOT-зависимости в production (невоспроизводимые сборки); не закоммичен wrapper (mvnw/gradlew) — новые инженеры видят несовпадение версий; transitive-конфликты (mvn dependency:tree показывает); долгие Gradle-сборки без configuration cache + build cache (gradle 7+).

Связанные понятия

Полезные ресурсы