Почему введение модуля-родителя изменяет правила / порядок зависимостей этого модуля в Gradle 5?

У меня есть два модуля:

  • База Пб
  • оказание услуг

base-lib имеет некоторые зависимости Spring Boot/Security, а также некоторые Azure. Для Azure требуется определенная версия nimbusds, поэтому я установил эту зависимость для конкретной версии (5.64.4). Когда я сам собираю этот первый модуль, Gradle загружает только 5.64.4. Но когда я включаю его в качестве зависимости проекта от другого модуля (у которого нет других зависимостей), он загружает две версии: 5.64.4 и 6.0. Почему это было бы иначе?

base-lib: build.gradle

buildscript {

    repositories {
        mavenCentral()
        mavenLocal()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: "java"
apply plugin: "java-library"
apply plugin: "org.springframework.boot"
apply plugin: "io.spring.dependency-management"

group "${group}"
version "${version}"

sourceCompatibility = 11.0

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {

    api( [ "com.nimbusds:oauth2-oidc-sdk:5.64.4" ] )

    /* These are what pulls in 6.0 */
    api( [ "org.springframework.boot:spring-boot-starter-security:${springBootVersion}" ] )
    api( [ "org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:${springBootVersion}" ] )
    api( [ "org.springframework.security:spring-security-oauth2-client:${springOAuthClientVersion}" ] )

    //Microsoft Azure AD
    api( [ "com.microsoft.azure:adal4j:${adal4jVersion}" ] )

    /* elided, lot's of other dependencies here */
}

сервис build.gradle

dependencies {
    implementation project(":base-lib")
}

Если я удаляю второй модуль (service) и соберите первый, затем он скачивает только 5.64.4. Но в тот момент, когда у меня есть и то, и другое, их тоже падает 6.0.

Это исправляет это, но почему это необходимо, когда используется как зависимость проекта, а не обычно? Почему правила зависимости разные?

api( [ "com.nimbusds:oauth2-oidc-sdk:5.64.4" ] ) {
    force = true
}

1 ответ

Решение

Лучший способ решить эту проблему - использовать dependencyInsight задание на проблемную зависимость.

В вашем случае наиболее вероятным объяснением является то, что ваш проект base-lib использует подключаемые модули Spring boot и Spring для управления зависимостями. Эти плагины принудительно запускают несколько версий в соответствии с загрузочной спецификацией Spring, но также имеют функцию, которая делает любую зависимость, объявленную с версией, перезаписывающей то, что исходит из спецификации. И так как вы указываете версию oauth2-oidc-sdk это действительно получает ту версию.

Теперь, когда вы переходите все эти зависимости в service, плагин управления зависимостями не применяется. И, таким образом, применяются правила разрешения Gradle по умолчанию, что означает, что между 5.64.4 а также 6.0 версии, Gradle выберет самый высокий.

Исправление может быть сделано путем форсирования версии, которую вы экспериментировали, или применения тех же плагинов и повторного объявления.

Другие вопросы по тегам