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

Как исключить зависимость библиотеки в Maven

1.3 Junior🔥 61 комментариев
#Другое#Основы Java

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

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

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

Как исключить зависимость библиотеки в Maven

Основной способ: элемент exclusion

В Maven зависимости часто приходят с транзитивными зависимостями, которые вам не нужны. Для их исключения используется элемент <exclusion>:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.0.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Этот пример исключает встроенный Tomcat из Spring Boot Web, что полезно, если вы планируете использовать другой сервер приложений (например, Undertow или Jetty).

Исключение нескольких зависимостей

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2022.0.0</version>
    <exclusions>
        <!-- Исключаем старую версию Jackson -->
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </exclusion>
        <!-- Исключаем неиспользуемый логирующий фреймворк -->
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Исключение по wildcard

Вы можете исключить все транзитивные зависимости от конкретного artfactId:

<exclusion>
    <groupId>commons-logging</groupId>
    <artifactId>*</artifactId>
</exclusion>

Проверка дерева зависимостей

Перед исключением проверьте дерево зависимостей:

mvn dependency:tree

Выведет:

[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:3.0.0:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-tomcat:jar:3.0.0:compile
[INFO] |  \- org.springframework.boot:spring-boot-starter-json:jar:3.0.0:compile

Это помогает понять, откуда приходят нежелательные зависимости.

Фильтрация в дереве зависимостей

mvn dependency:tree -Dincludes=org.slf4j

Показывает только зависимости, содержащие org.slf4j.

Исключение с явным указанием версии

Обычно версию указывать не нужно, но в конфликтных ситуациях поможет:

<exclusion>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.0</version>  <!-- опционально -->
</exclusion>

Практический пример: конфликт логирования

Частая ситуация — разные библиотеки используют разные логирующие фреймворки:

<dependencies>
    <!-- Используем только SLF4J + Logback -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.4.0</version>
    </dependency>

    <!-- Исключаем commons-logging из других зависимостей -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

Глобальное исключение в BOM

Для исключения, которое применяется ко многим зависимостям, используйте BOM (Bill of Materials):

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2022.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Альтернатива: переопределение версии

Вместо исключения можно явно указать нужную версию зависимости:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.15.0</version>  <!-- Переопределяем версию -->
        </dependency>
    </dependencies>
</dependencyManagement>

Этот подход часто лучше, так как не скрывает зависимость полностью, а только контролирует версию.

Проверка исключений

После добавления исключения убедитесь, что изменения работают:

# Обновить локальный репозиторий
mvn clean install

# Снова проверить дерево
mvn dependency:tree

Основные правила

  1. Исключайте только транзитивные зависимости — никогда не исключайте основную библиотеку
  2. Проверяйте дерево перед исключением — убедитесь, что видите всю картину
  3. Предпочитайте переопределение версии исключению — это явнее
  4. Документируйте причину исключения в комментарии
  5. Тестируйте после изменений — убедитесь, что ничего не сломалось

Пример с комментарием

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.0.0</version>
    <exclusions>
        <!-- Исключаем Tomcat, так как используем Undertow для лучшей производительности -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>