← Назад к вопросам
Как в родительском pom.xml задаются версии библиотек в Maven
1.0 Junior🔥 161 комментариев
#Другое
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Управление версиями библиотек в Maven через родительский pom.xml
Проблема без управления версиями
В большом многомодульном проекте разные модули могут использовать разные версии одной и той же библиотеки, что приводит к конфликтам и непредсказуемому поведению:
<!-- module1/pom.xml -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- module2/pom.xml -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version> <!-- Другая версия! -->
</dependency>
Решение: dependencyManagement в родительском pom.xml
Структура многомодульного проекта
myproject/
├── pom.xml (родитель)
├── module1/
│ └── pom.xml
├── module2/
│ └── pom.xml
└── module3/
└── pom.xml
Родительский pom.xml с управлением версиями
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>MyProject Parent</name>
<!-- Определение свойств версий -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<!-- Версии основных библиотек -->
<spring-boot.version>2.7.14</spring-boot.version>
<junit.version>4.13.2</junit.version>
<mockito.version>4.11.0</mockito.version>
<slf4j.version>1.7.36</slf4j.version>
<jackson.version>2.15.2</jackson.version>
</properties>
<!-- Управление зависимостями - контролирует версии -->
<dependencyManagement>
<dependencies>
<!-- Spring Boot BOM (Bill of Materials) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- Mockito -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
<!-- SLF4J -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- Общие зависимости для всех модулей -->
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
</dependencies>
<!-- Управление плагинами -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
</plugins>
</pluginManagement>
<!-- Модули проекта -->
<modules>
<module>module1</module>
<module>module2</module>
<module>module3</module>
</modules>
</project>
Дочерние модули используют управление версиями
module1/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Ссылка на родителя -->
<parent>
<groupId>com.example</groupId>
<artifactId>myproject-parent</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>myproject-module1</artifactId>
<name>MyProject Module 1</name>
<dependencies>
<!-- Версия берётся из dependencyManagement родителя -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<!-- VERSION НЕ УКАЗЫВАЕМ! -->
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
Три способа управления версиями
1. dependencyManagement в родителе (наиболее распространено)
<!-- parent/pom.xml -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- child/pom.xml -->
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<!-- Версия не указывается -->
</dependency>
</dependencies>
2. BOM (Bill of Materials) - импорт из другого проекта
<!-- Используется существующий BOM (например, Spring) -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.14</version>
<type>pom</type>
<scope>import</scope>
<!-- import даёт доступ ко всем зависимостям этого BOM -->
</dependency>
</dependencies>
</dependencyManagement>
3. Свойства (properties) для версий
<properties>
<jackson.version>2.15.2</jackson.version>
<hibernate.version>5.6.15.Final</hibernate.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
Важный момент: dependencyManagement vs dependencies
dependencyManagement - только контроль версий
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- Эта зависимость НЕ будет включена в child модули автоматически! -->
<!-- Child модули должны явно указать эту зависимость (без версии) -->
dependencies - зависимости для всех
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
</dependencies>
<!-- Эта зависимость БУДЕТ включена в ВСЕ child модули автоматически -->
Практический пример: Spring Boot многомодульный проект
<!-- pom.xml (родитель) -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>myapp-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<spring-boot.version>2.7.14</spring-boot.version>
<java.version>11</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>myapp-api</module>
<module>myapp-core</module>
<module>myapp-web</module>
</modules>
</project>
<!-- myapp-api/pom.xml -->
<project>
<parent>
<groupId>com.mycompany</groupId>
<artifactId>myapp-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>myapp-api</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- Версия из BOM -->
</dependency>
</dependencies>
</project>
Команды Maven для работы с зависимостями
# Просмотр дерева зависимостей
mvn dependency:tree
# Просмотр конкретного модуля
mvn dependency:tree -pl module1
# Поиск конфликтов версий
mvn dependency:analyze
# Обновление версий плагинов
mvn versions:display-plugin-updates
# Обновление версий зависимостей
mvn versions:display-dependency-updates
Ключевые преимущества
- Единая версия - все модули используют одинаковые версии библиотек
- Легко обновлять - меняешь версию в одном месте
- Избегаешь конфликтов - нет несовместимых версий
- Наследование - дочерние модули наследуют конфигурацию
- BOM реиспользование - можно импортировать готовые BOM'ы
- Меньше дублирования - DRY принцип
Типичные ошибки
<!-- ОШИБКА 1: Забыл указать версию в dependencyManagement -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!-- Версия не указана! -->
</dependency>
</dependencies>
</dependencyManagement>
<!-- ОШИБКА 2: Указывает версию и в dependencyManagement, и в dependency -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version> <!-- Конфликт! -->
</dependency>
</dependencies>