Почему введение модуля-родителя изменяет правила / порядок зависимостей этого модуля в 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 выберет самый высокий.
Исправление может быть сделано путем форсирования версии, которую вы экспериментировали, или применения тех же плагинов и повторного объявления.