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

Как я могу заставить 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 установить одну и ту же версию для этих двух зависимостей?

4b9b3361

Ответ 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'
        }
    }
}