Какая спецификация Maven определяет версию зависимости в Gradle 5?
В настоящее время я занимаюсь разработкой проекта Gradle 5, который импортирует две разные спецификации Maven. Поэтому я использую собственный синтаксис Gradle без плагина управления зависимостями. Однако обе спецификации могут определять разные версии для одной и той же зависимости.
dependencies {
implementation platform ("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")
implementation platform ("com.organisation:xyz:${otherBomVersion}")
}
Насколько я знаю в Maven, первая спецификация, которая определяет версию для данной зависимости, определяет ее. Напротив, в плагине управления зависимостями Gradle последняя спецификация, которая определяет версию для данной зависимости, определяет ее.
Как обрабатывается порядок импортированных спецификаций в чистом Gradle 5?
0 ответов
Порядок спецификаций или место, где объявлена зависимость, в Gradle не имеет значения. В отличие от Maven, который использует подход ближайшего первого, Gradle принимает во внимание всю информацию о зависимостях и выбирает самую высокую. В документации указано
Gradle будет рассматривать все запрошенные версии, где бы они ни появлялись на графике зависимостей. Из этих версий он выберет самую высокую.
Практический пример. Следующее объявление всегда будет выбирать
2.2.5.RELEASE
Spring Cloud Gateway определяется версией спецификации spring-cloud-dependencies
Hoxton.SR8
независимо от того, какой
platform()
декларация указывается первой:
dependencies {
implementation platform('org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8')
implementation platform('org.springframework.cloud:spring-cloud-dependencies:Greenwich.SR6')
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
}
Отчет о зависимостях может выглядеть следующим образом:
> gradlew -q dependencyInsight --dependency spring-cloud-starter-gateway
org.springframework.cloud:spring-cloud-starter-gateway:2.2.5.RELEASE (by constraint)
variant "compile" [
org.gradle.status = release (not requested)
org.gradle.usage = java-api
org.gradle.libraryelements = jar (compatible with: classes)
org.gradle.category = library (not requested)
Requested attributes not found in the selected variant:
org.gradle.dependency.bundling = external
org.gradle.jvm.version = 8
]
org.springframework.cloud:spring-cloud-starter-gateway:2.2.5.RELEASE
\--- org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR8
\--- compileClasspath
org.springframework.cloud:spring-cloud-starter-gateway -> 2.2.5.RELEASE
\--- compileClasspath
Вы можете использовать
enforcedPlatform()
если вы предпочитаете версии из конкретной спецификации.
Более простым предложением было бы использовать этот механизм, описанный в документации Spring Boot Gradle Plugin, посредством чего вы можете явно переопределить выбранные версии, задав свойства.
Вот пример, который они приводят:
ext['slf4j.version'] = '1.7.20'
Полный список свойств, которые вы можете установить, можно найти в справочной документации Spring Boot.
В конце концов, у вас будет явный способ переопределить значения по умолчанию, заданные Spring Boot.
А, и теперь я вижу, что вы на самом деле не используете этот плагин, поэтому этот механизм к вам не применим. Что ж, если вы начнете его использовать, все вышеперечисленное должно работать как задумано и быть предсказуемым.