← Назад к вопросам

Возможны ли конфликты версии между библиотеками внутри одного стартера?

1.7 Middle🔥 141 комментариев
#Spring Boot и Spring Data

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Конфликты версий между библиотеками в стартерах

Да, конфликты версий возможны и довольно распространены, несмотря на то, что стартеры (Spring Boot Starters, например) специально разработаны для их минимизации.

Как стартеры защищают от конфликтов

Стартеры используют BOM (Bill of Materials) — список с согласованными версиями зависимостей.

<!-- spring-boot-starters используют spring-boot-dependencies BOM -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.2.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- версия берется из BOM -->
    </dependency>
</dependencies>

Когда всё же возникают конфликты

1. Явное переопределение версии

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Конфликт: Lombok версии 1.18.30 вместо 1.18.28 из BOM -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
    </dependency>
</dependencies>

2. Несовместимые трансзависимости

Когда в стартер попадают разные версии одной библиотеки через разные пути:

spring-boot-starter-web
├── spring-web (5.3.20)
│   └── jackson-databind (2.15.0)
│       └── jackson-core (2.15.0)
│
кастомная-библиотека
└── jackson-core (2.14.0)  ← конфликт!

3. Множественные стартеры разных фреймворков

<!-- Spring Boot 3.2.0 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Quarkus 3.5.0 - другой BOM -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy</artifactId>
</dependency>

<!-- Возможны конфликты версий Jackson, JakartaEE и др. -->

Как выявить конфликты

Maven Dependency Tree

mvn dependency:tree

# Вывод покажет иерархию:
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:3.2.0:compile
[INFO] |  +- org.springframework:spring-webmvc:jar:6.0.0:compile
[INFO] |  |  +- org.springframework:spring-context:jar:6.0.0:compile
[INFO] |  |  |  +- org.springframework:spring-beans:jar:6.0.0:compile

Поиск дублей

mvn dependency:tree | grep -E "(\[CONFLICT\]|duplicate)"

Gradle

./gradlew dependencies --configuration compileClasspath

Стратегии разрешения конфликтов

1. Полагаться на BOM (рекомендуется)

<dependencyManagement>
    <dependencies>
        <!-- Импортируем целый BOM -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.2.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- Декларируем только что нужно, версия из BOM -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

2. Явное исключение конфликтной зависимости

<dependency>
    <groupId>кастомная-библиотека</groupId>
    <artifactId>my-lib</artifactId>
    <version>2.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3. Dependabot / Renovate

Автоматизируй отслеживание обновлений:

# renovate.json
{
  "extends": ["config:base"],
  "springBoot": {
    "enabled": true,
    "rangeStrategy": "bump"
  }
}

Лучшие практики

  1. Минимизируй зависимости - добавляй только необходимые стартеры
  2. Используй единый BOM - если интегрируешь несколько фреймворков
  3. Регулярно проверяй дерево зависимостей - mvn dependency:tree
  4. Документируй явные версии - почему переопределяешь версию из BOM
  5. Изолируй конфликтующие библиотеки - если возможно, используй разные classloaders

Пример комбинированного подхода

<dependencyManagement>
    <dependencies>
        <!-- BOM Spring Boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.2.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        
        <!-- BOM другого проекта если нужен -->
        <dependency>
            <groupId>io.micronaut</groupId>
            <artifactId>micronaut-bom</artifactId>
            <version>3.9.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Так что да, конфликты возможны, но их можно эффективно контролировать правильной организацией зависимостей.

Возможны ли конфликты версии между библиотеками внутри одного стартера? | PrepBro