как gradle разрешает конфликтующие версии зависимостей

Скажем, у меня есть 3 модуля с 3 разными файлами свойств build.gradle.

Модуль A v1 имеет следующие записи в build.gradle

ATLAS_VERSION = 1

Модуль B v1 имеет следующие записи в build.gradle

ATLAS_VERSION = 2
MODULE_A_VERSION = 1

Модуль C v1 имеет следующие записи в файле build.gradle.

ATLAS_VERSION = 3
MODULE_B_VERSION = 1

Итак, мой вопрос: какая версия ATLAS будет разрешена во время выполнения?


person Klaus Nji    schedule 14.05.2019    source источник


Ответы (1)


Согласно этой документации Gradle Управление транзитивными зависимостями, на случай, если вы не указывайте каких-либо конкретных ограничений для разрешения транзитивных зависимостей, следует выбрать самую старшую версию модулей ATLAS:

Когда Gradle пытается разрешить зависимость от версии модуля, учитываются все объявления зависимостей с версией, все транзитивные зависимости и все ограничения зависимостей для этого модуля. Выбирается самая старшая версия, соответствующая всем условиям.

Вы можете быстро протестировать это поведение с помощью простой многопроектной сборки ниже:

settings.gradle

rootProject.name = 'demo'
include "A", "B", "C"

build.gradle

subprojects{
    apply plugin: "java"
    repositories{
        mavenCentral()
    }
}
project(':A') {
    dependencies{
        implementation 'commons-io:commons-io:1.2'
    }
}
project(':B') {
    dependencies{
        implementation project(":A")
        implementation 'commons-io:commons-io:2.0'
    }
}
project(':C') {
    dependencies{
        implementation project(":B")
        implementation 'commons-io:commons-io:2.6'
    }
}

Затем вы можете проверить, какая версия commons-io была выбрана, то есть 2.6 :

./gradlew C:dependencies

runtimeClasspath - Runtime classpath of source set 'main'.
+--- project :B
|    +--- project :A
|    |    \--- commons-io:commons-io:1.2 -> 2.6
|    \--- commons-io:commons-io:2.0 -> 2.6
\--- commons-io:commons-io:2.6
person M.Ricciuti    schedule 14.05.2019