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

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для глобального исключения транзитивной зависимости в Gradle произведите правки в блоке configurations.all файла build.gradle:

groovy
Скопировать код
configurations.all {
    exclude group: 'com.unwanted', module: 'dependency' // Прощай, ненужная зависимость!
}

Так, зависимость dependency из группы com.unwanted будет исключена из всех конфигураций сборки.

Кинга Идем в IT: пошаговый план для смены профессии

Подход к транзитивным зависимостям

Транзитивные зависимости — это зависимости, подключаемые неявно через другие зависимости вашего проекта. С одной стороны, они могут дополнять ваш проект необходимыми библиотеками, с другой — вызывать конфликты и риски.

В отличие от Maven, где используется artifactId, в Gradle сходная сущность называется модулем. Так, groupId:artifactId:version из Maven в Gradle преобразуются в group:name:version.

Исключение зависимостей на профессиональном уровне

Чтобы исключить конкретный модуль из всех конфигураций, используйте команду exclude в разделе configurations.all файла build.gradle. Этот метод позволит вам избавиться от проблемных зависимостей в один удар:

groovy
Скопировать код
configurations.all {
    exclude group: 'com.problematic', module: 'troublesome-dependency' // Уходи в никуда!
}

С помощью данной настройки модуль troublesome-dependency из com.problematic будет исключен из всех настроек проекта.

Будьте бдительны: следите за синтаксисом

Работайте с синтаксисом аккуратно, особенно в блоке exclude, чтобы не исключить случайно нужные зависимости. Удостоверьтесь, что названия группы и модуля точно соответствуют тому, что вы хотите исключить.

Если столкнулись с ситуацией, когда исключение работает слишком широко, создайте пример воспроизводимой ошибки и сообщите об этом.

Визуализация

Представьте транзитивные зависимости как незванных гостей на вечеринке вашего проекта:

Markdown
Скопировать код
Зависимость 🕳️: commons-logging:commons-logging:1.2
Транзитивные гости 🐾: [
  logkit:logkit:1.0.1,
  avalon-framework:avalon-framework:4.1.5,
  log4j:log4j:1.2.12
]

Решите вопрос с их присутствием, исключив ненужных:

groovy
Скопировать код
configurations {
    all {
        exclude group: 'commons-logging', module: 'commons-logging' // Внимание, commons-logging!
    }
}

И вот ваша вечеринка свободна от незванных гостей:

Markdown
Скопировать код
🚫🐾 Больше нет скрытых транзитивных зависимостей в вашем проекте!

Они исключены, что позволяет поддерживать порядок и чистоту.

Повышение уровня: продвинутые приемы исключения и замены

В случаях, когда проект включает несколько конфигураций, например, runtime и compileClasspath, используйте configurations.all для единообразного управления зависимостями.

Если требуется заменить версию модуля, а не полностью его исключить, примените "Стратегию Резолюции":

groovy
Скопировать код
configurations.all {
    resolutionStrategy {
        eachDependency { DependencyResolveDetails details ->
            if (details.requested.group == 'com.unwanted' && details.requested.name == 'dependency') {
                details.useVersion 'desired.version' // Дайте, пожалуйста, другую версию!
            }
        }
    }
}

Запомните эти подходы для работы даже со старыми версиями Gradle, начиная от 1.10.

Полезные материалы

  1. Официальное руководство по управлению зависимостями — полезный источник информации для изучающих работу с Gradle.
  2. Исключение транзитивных зависимостей — статья о методиках исключения.
  3. DependencyHandler – Gradle DSL Версия 8.6 — справочные материалы по Gradle DSL и управлению зависимостями.
  4. Настройка резолюции зависимости напрямую — инструкция по замене модулей.
  5. Build Scan® | Gradle Cloud Services — инструмент для анализа зависимостей проекта.