Как разрешить конфликт версий CGLIB (2.x vs 3.x) в Maven или Gradle?

«Как разрешить конфликт версий CGLIB (2.x vs 3.x) в Maven или Gradle?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Конфликт возникает, когда одна зависимость требует CGLIB 2.x, а ваш код или другая зависимость — CGLIB 3.x. Решение — явно исключить транзитивную зависимость старой версии и добавить новую.

Для Maven:

<dependency>
    <groupId>org.example</groupId>
    <artifactId>library-requires-cglib2</artifactId>
    <version>1.0</version>
    <!-- Исключаем транзитивную cglib:2.x -->
    <exclusions>
        <exclusion>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- Явно добавляем нужную версию CGLIB -->
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>

Для Gradle:

dependencies {
    implementation('org.example:library-requires-cglib2:1.0') {
        exclude group: 'cglib', module: 'cglib'
    }
    implementation 'cglib:cglib:3.3.0'
}

Важные замечания:

  1. Проверьте совместимость. CGLIB 3.x имеет изменения в API. Убедитесь, что библиотека, требующая версию 2.x, будет работать с 3.x. В противном случае может потребоваться обновить эту библиотеку или найти альтернативу.
  2. Анализ зависимостей. Используйте mvn dependency:tree или gradle dependencies, чтобы увидеть, какая именно библиотека приносит конфликтующую версию.
  3. Spring и CGLIB. Spring Framework для AOP прокси использует CGLIB. Убедитесь, что выбранная версия CGLIB совместима с вашей версией Spring.