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

Что делать, если нужен CGLIB версии 3, но артефакт поддерживает 2 версию

1.2 Junior🔥 121 комментариев
#Soft Skills и карьера

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

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

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

Разрешение конфликта версий CGLIB

CGLIB (Code Generation Library) — это библиотека для динамического создания подклассов во время выполнения. Конфликт версий часто возникает в Spring-проектах, так как Spring использует CGLIB для создания прокси объектов. Рассмотрим несколько стратегий решения этой проблемы.

Понимание проблемы

В Maven зависимостях может быть ситуация:

  • Основной артефакт требует CGLIB 2.x
  • Ваше приложение или другие зависимости требуют CGLIB 3.x
  • Возникает конфликт версий и могут быть нарушены функции

Решение 1: Явное управление версией (Рекомендуется)

<!-- pom.xml -->
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version> <!-- Явно указываем нужную версию -->
</dependency>

<!-- Или исключаем старую версию из артефакта -->
<dependency>
    <groupId>com.example</groupId>
    <artifactId>some-library</artifactId>
    <version>1.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>

Решение 2: Использование dependencyManagement

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.3.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>some-library</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

Решение 3: Spring версия (если используется Spring)

Если проблема в Spring Framework, проверьте версию Spring:

<!-- Spring 5.x и 6.x имеют встроенные механизмы для работы с CGLIB -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <version>2.7.0</version>
    <!-- spring-boot-starter-aop включает правильную версию CGLIB -->
</dependency>

Решение 4: gradle.lockfile (для Gradle)

Если проект использует Gradle:

dependencies {
    constraints {
        implementation 'cglib:cglib:3.3.0'
    }
    
    implementation 'com.example:some-library:1.0.0'
}

// Или прямое исключение
implementation('com.example:some-library:1.0.0') {
    exclude group: 'cglib', module: 'cglib'
}

implementation 'cglib:cglib:3.3.0'

Диагностика проблемы

# Maven: показывает дерево зависимостей
mvn dependency:tree | grep cglib

# Gradle: показывает граф зависимостей
./gradlew dependencies | grep cglib

# Проверить какая версия загружена в runtime
System.out.println("CGLIB version: " + net.sf.cglib.core.ClassGenerator.class.getProtectionDomain().getCodeSource().getLocation());

Решение 5: Обновление артефакта

Если возможно, обновите зависимость, которая требует старую версию CGLIB:

<!-- Старая версия -->
<dependency>
    <groupId>com.example</groupId>
    <artifactId>old-library</artifactId>
    <version>1.0.0</version> <!-- требует CGLIB 2.x -->
</dependency>

<!-- Новая версия -->
<dependency>
    <groupId>com.example</groupId>
    <artifactId>old-library</artifactId>
    <version>2.0.0</version> <!-- поддерживает CGLIB 3.x -->
</dependency>

Решение 6: Шейд CGLIB

Для сложных случаев можно использовать Maven Shade Plugin для упаковки нужной версии:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <relocations>
                    <relocation>
                        <pattern>net.sf.cglib</pattern>
                        <shadedPattern>com.myapp.cglib</shadedPattern>
                    </relocation>
                </relocations>
            </configuration>
        </execution>
    </executions>
</plugin>

Best Practices

  1. Используйте dependencyManagement для централизованного управления версиями
  2. Проверяйте дерево зависимостей перед добавлением новых зависимостей
  3. Исключайте конфликтующие версии явно
  4. Предпочитайте свежие версии зависимостей
  5. Документируйте причину выбора конкретной версии

Итог: Лучший подход — использовать явное управление версией через <dependency> с исключением старой версии. Это гарантирует, что нужная версия CGLIB будет загружена и никакие конфликты не возникнут.

Что делать, если нужен CGLIB версии 3, но артефакт поддерживает 2 версию | PrepBro