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, он не был исключен. Зачем? Как его исключить?
Ответы
Ответ 1
Проблема заключалась в том, что другой объект компиляции также зависел от зависимости первого уровня, которая имела guava-jdk5 как транзитивную зависимость, поэтому этот другой объект приводил к нежелательному модулю.
Я смог наконец увидеть это, используя
./gradlew -q :app:dependencyInsight --dependency guava --configuration compile
и может исключить его с помощью
configurations {
compile.exclude module: 'guava-jdk5'
}
Ответ 2
Ответ автора вопроса мне не помог, потому что он слишком узкий/конкретный. Это модифицированный подход, который работает для исключения любого модуля:
-
Проверьте в настоящий момент распознанные зависимости, используя эту команду в "Терминале":
gradlew app:dependencies
Команда выдается из корня вашего проекта и здесь "app" следует заменить именем вашего приложения "module".
Вы также можете перейти в папку вашего приложения и запустить это:
..\gradlew -q dependencies
Примечание: используйте ../gradle
в Linux.
Вы увидите, что существует несколько конфигураций, а не только "compile" (например, "_debugCompile" и т.д.). Каждая "конфигурация" имеет свои зависимости! Вот почему, например, исключения чего-либо в конфигурации "compile" может быть недостаточно.
-
Теперь примените исключение ко всем "конфигурациям" следующим образом: Добавьте этот блок в файл приложения ("модуль") 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
-
Повторите шаги 1. и 2., пока вы не увидите модули, которые вы хотите исключить, в списке зависимостей любой конфигурации.
Совет: здесь, внутри блока "all", вы можете разместить:
transitive = false
И вы избавитесь от всех переходных зависимостей.