Подтвердить что ты не робот

Gradle не будет исключать модуль по запросу

Я не могу исключить модуль guava в файле build.gradle с помощью "exclude".

С этим блоком зависимостей:

dependencies {
    ...
    compile(group: 'com.google.api-client', name: 'google-api-client', version: '1.19.0') {
        exclude(group: 'com.google.guava', module: 'guava-jdk5') // !!! Doesn't work!!!
       ...
    }
...
}

Я получаю дерево зависимостей ниже. Обратите внимание, что guava-jdk5 не исключается.

+--- com.google.api-client:google-api-client:1.19.0
|    +--- com.google.oauth-client:google-oauth-client:1.19.0
|    |    +--- com.google.http-client:google-http-client:1.19.0
|    |    |    ...
|    |    \--- com.google.code.findbugs:jsr305:1.3.9
|    ...
|    \--- com.google.guava:guava-jdk5:13.0

...

Обратите внимание, что последняя строка по-прежнему включает модуль guava, он не был исключен. Зачем? Как его исключить?

4b9b3361

Ответ 1

Проблема заключалась в том, что другой объект компиляции также зависел от зависимости первого уровня, которая имела guava-jdk5 как транзитивную зависимость, поэтому этот другой объект приводил к нежелательному модулю.

Я смог наконец увидеть это, используя

./gradlew -q :app:dependencyInsight --dependency guava --configuration compile

и может исключить его с помощью

configurations {
    compile.exclude module: 'guava-jdk5'
}

Ответ 2

Ответ автора вопроса мне не помог, потому что он слишком узкий/конкретный. Это модифицированный подход, который работает для исключения любого модуля:

  1. Проверьте в настоящий момент распознанные зависимости, используя эту команду в "Терминале":

    gradlew app:dependencies
    

Команда выдается из корня вашего проекта и здесь "app" следует заменить именем вашего приложения "module".

Вы также можете перейти в папку вашего приложения и запустить это:

..\gradlew -q dependencies

Примечание: используйте ../gradle в Linux.

Вы увидите, что существует несколько конфигураций, а не только "compile" (например, "_debugCompile" и т.д.). Каждая "конфигурация" имеет свои зависимости! Вот почему, например, исключения чего-либо в конфигурации "compile" может быть недостаточно.

  1. Теперь примените исключение ко всем "конфигурациям" следующим образом: Добавьте этот блок в файл приложения ("модуль") gradle.build (со списком исключаемых модулей, конечно :-)):

    configurations {
        all {
            exclude module: 'httpclient'
            exclude module: 'httpcore'
        }
    }
    

    Подсказка: случаи исключения авансов обсуждаются, например, здесь: https://discuss.gradle.org/t/how-do-i-exclude-specific-transitive-dependencies-of-something-i-depend-on/17991/7

  2. Повторите шаги 1. и 2., пока вы не увидите модули, которые вы хотите исключить, в списке зависимостей любой конфигурации.

Совет: здесь, внутри блока "all", вы можете разместить:

transitive = false

И вы избавитесь от всех переходных зависимостей.