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

«Возможны ли конфликты версий библиотек внутри Spring Boot стартера?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, возможны. Стартер — это набор зависимостей (транзитивных в том числе). Если две библиотеки внутри стартера или стартер и ваша явная зависимость требуют разных несовместимых версий одной библиотеки, возникает конфликт.

Как Maven/Gradle разрешают конфликт: Системы сборки используют стратегию «ближайший выигрывает» (Maven) или «самая высокая версия» (по умолчанию в Gradle). Это может привести к неявному выбору версии.

Пример и диагностика:

<!-- В pom.xml -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId> <!-- Неявно тянет, например, jackson-databind 2.15.0 -->
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.0</version> <!-- Конфликт версий! -->
</dependency>

Как управлять версиями:

  1. Анализ: mvn dependency:tree или gradle dependencies.
  2. Управление через BOM: Spring Boot spring-boot-dependencies управляет версиями за вас.
  3. Явное указание: В Maven — секция <dependencyManagement>; в Gradle — resolutionStrategy или принудительное задание версии (force).