Как я могу заставить Gradle установить одну и ту же версию для двух зависимостей?
Я использую следующие две зависимости:
compile 'com.google.guava:guava:14.0.1'
compile 'com.google.guava:guava-gwt:14.0.1'
Оба должны быть одинаковыми для правильной работы. Поскольку мои другие зависимости используют более высокую версию, Gradle использует разные версии для каждой зависимости.
Я нашел это, запустив gradle dependencies
:
compile - Compile classpath for source set 'main'.
+--- com.google.guava:guava:14.0.1 -> 17.0
+--- com.google.guava:guava-gwt:14.0.1
| +--- com.google.code.findbugs:jsr305:1.3.9
| \--- com.google.guava:guava:14.0.1 -> 17.0
Как я могу заставить Gradle установить одну и ту же версию для этих двух зависимостей?
Ответы
Ответ 1
Одна из ваших зависимостей заставляет версию guava обновляться. Используйте gradle dependencies
, чтобы определить, какая библиотека выдает вашу версию.
Проблема заключается в том, что если вы вынуждаете ее использовать 14.0.1, другая библиотека может работать неправильно. Не можете ли вы использовать версию 17.0 в качестве вашей зависимости?
Вместо того, чтобы поддерживать отдельные номера версий в build.gradle, я использую файл dependencies.gradle, который будет иметь сопоставление номеров версий и вытащить их в build.gradle. Таким образом, мне нужно поддерживать только одну версию guava. Таким образом, ваш пример будет:
dependencies.gradle
ext {
ver = [
guava: '14.0.1'
]
}
а затем в файле build.gradle вы можете:
apply from: "dependencies.gradle"
dependencies {
compile group: 'com.google.guava', module: 'guava', version: ver.guava
compile group: 'com.google.guava', module: 'guava-gwt', version: ver.guava
}
тогда, когда я хочу перейти на 17.0, мне нужно только изменить dependencies.gradle.
Я также являюсь определенным поклонником установки транзитивных зависимостей с ложным с
configurations.compile { transitive = false }
Таким образом, у вас нет некоторых зависимостей, выведенных во время компиляции, хотя у вас может быть проблема во время выполнения, если библиотека выселения не полностью обратная совместимость. Давайте посмотрим правде в глаза, если вы пишете код, который должен знать, какие библиотеки вы используете, и вы должны быть откровенно о ваших зависимостях. Он защищает вас от одной из ваших зависимостей, модернизируя и запуская вас.
Ответ 2
Добавьте этот раздел в файл dependencies.gradle
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:14.0.1'
force 'com.google.guava:guava-gwt:14.0.1'
}
}
Ответ 3
configurations.all {
resolutionStrategy {
eachDependency { DependencyResolveDetails details ->
if (details.requested.group == 'com.google.guava') {
details.useVersion "14.0.1"
}
}
}
}
dependencies {
compile 'com.google.guava:guava'
compile 'com.google.guava:guava-gwt'
}
Ответ 4
У меня была аналогичная ситуация, когда одна из зависимостей использовала spring -web 4.2.4, которая была нарушена. Вы должны принудительно использовать определенную версию библиотеки. Как упоминалось в другом комментарии, это может вызвать проблемы совместимости, но иногда это необходимо.
Наименее навязчивый способ заставить библиотечную версию, которую я нашел, вместо использования
compile "org.springframework:spring-web:4.2.3.RELEASE"
указание конфигурации зависимостей как принудительное:
compile("org.springframework:spring-web:4.2.3.RELEASE"){
force = true
}
Я использовал его, когда мне нужно было временно понизить версию Spring (до следующей версии).
Ответ 5
В качестве альтернативы вы можете использовать функции dependencySets (или mavenBom при наличии BOM POM) в плагине spring -dependency-management Gradle. Обратите внимание, что этот плагин также автоматически применяется с плагином spring -boot Gradle. Подробнее см. здесь.
plugins {
id 'io.spring.dependency-management' version '1.0.1.RELEASE'
}
dependencyManagement {
dependencies {
dependencySet(group: 'com.google.guava', version: '14.0.1') {
entry 'guava'
entry 'guava-gwt'
}
}
}
dependencies {
compile 'com.google.guava:guava'
compile 'com.google.guava:guava-gwt'
}
Ответ 6
Я бы посоветовал не устанавливать transitive = false
, поскольку с этого момента вам придется самостоятельно разрешать дерево зависимостей.
Вы можете либо принудительно установить нужную версию гуавы через configurations.all
, либо явно добавить зависимость и установить ее forced = true
.
Примеры здесь: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/
Ответ 7
Если все в порядке, если вы просто используете более новую версию для обеих зависимостей, самый простой способ решить вашу проблему - это обновить ваши зависимости:
compile 'com.google.guava:guava:17.0'
compile 'com.google.guava:guava-gwt:17.0'
Это гарантирует, что они оба на 17.0. Это проще, чем пытаться заставить их обоих использовать более старую версию, и в качестве дополнительного бонуса вы получаете более новую версию, которая (вероятно) поставляется с исправлениями ошибок и новыми функциями.
Справедливости ради @Klunk упоминает об этом в своем ответе, спрашивая: "Можете ли вы не просто использовать версию 17.0 в качестве своей зависимости?", Но это просто мимоходом и легко пропустить, поэтому я подумал, что имеет смысл опубликовать отдельный ответ,
Ответ 8
Другой вариант - использовать ограничение зависимости: https://docs.gradle.org/current/userguide/managing_transitive_dependencies.html#sec:dependency_constraints
dependencies {
implementation 'org.apache.httpcomponents:httpclient'
constraints {
implementation('org.apache.httpcomponents:httpclient:4.5.3') {
because 'previous versions have a bug impacting this application'
}
implementation('commons-codec:commons-codec:1.11') {
because 'version 1.9 pulled from httpclient has bugs affecting this application'
}
}
}