Автор Энди Уилкинсон, в блоге Spring
Управление зависимостями Maven включает концепцию ведомости материалов (bom). Бом — это особый вид пом, который используется для управления версиями зависимостей проекта и обеспечивает центральное место для определения и обновления этих версий.
Ряд проектов Spring, в том числе Spring Framework, Spring Cloud, Spring Boot и Spring IO Platform, предоставляют возможности для облегчения работы пользователей Maven. К сожалению, все не так просто, если вы используете Gradle.
Управление зависимостями в Gradle
Управление зависимостями Gradle использует ResolutionStrategy
управление версиями зависимостей проекта. Это обеспечивает большую мощность и гибкость, но не позволяет повторно использовать управление зависимостями, которое уже было объявлено в бомбе Maven. В результате вы должны сделать это вручную. В зависимости от специфики, это может легко приравнять к десяткам дополнительных строк в вашем build.gradle
скрипте только для повторного использования существующей конфигурации.
Повторное использование бомбы в Gradle
Одной из основных сильных сторон Gradle является то, что его можно легко расширять и настраивать его поведение с помощью плагинов. Мы воспользовались этим и написали плагин для управления зависимостями для Gradle . Этот плагин позволяет вам использовать бомбу Maven для управления зависимостями вашей сборки в несколько строк:
plugins { id "io.spring.dependency-management" version "0.4.0.RELEASE" } dependencyManagement { imports { mavenBom 'io.spring.platform:platform-bom:1.1.1.RELEASE' } }
С этой конфигурацией вы можете объявить зависимости от чего-либо в BOM без указания версии:
dependencies { compile 'org.springframework:spring-core' }
Импортированная бомба будет контролировать версию зависимости. Он также будет контролировать версию своих транзитивных зависимостей, если они перечислены в списке.
Исключения в Gradle
Gradle может извлекать зависимости из репозитория Maven, и для этого он использует метаданные в файлах pom Maven. Однако вместо того, чтобы подчиняться правилам Maven, он применяет свою собственную, слегка различную семантику к метаданным. Одной из областей, где это может вызвать проблемы, является исключение транзитивных зависимостей. Это лучше всего иллюстрируется простым примером.
Представьте себе модуль , который зависит от нескольких Spring Framework модулей, spring-core
и spring-beans
, и что использование SLF4J , а не Commons Logging. Зависимости в его pom будут выглядеть примерно так:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.4.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.10</version> </dependency>
Если сборка Maven зависит от этого модуля, его дерево зависимостей будет выглядеть так:
\- com.example:my-library:jar:0.0.1-SNAPSHOT:compile +- org.springframework:spring-core:jar:4.1.4.RELEASE:compile +- org.springframework:spring-beans:jar:4.1.4.RELEASE:compile \- org.slf4j:jcl-over-slf4j:jar:1.7.10:compile \- org.slf4j:slf4j-api:jar:1.7.10:compile
commons-logging
не указан как единственный модуль, который зависит от того, spring-core
где он был исключен.
Дерево зависимостей эквивалентной сборки Gradle выглядит следующим образом:
\--- com.example:my-library:0.0.1-SNAPSHOT +--- org.springframework:spring-core:4.1.4.RELEASE | \--- commons-logging:commons-logging:1.2 +--- org.springframework:spring-beans:4.1.4.RELEASE | \--- org.springframework:spring-core:4.1.4.RELEASE (*) \--- org.slf4j:jcl-over-slf4j:1.7.10 \--- org.slf4j:slf4j-api:1.7.10
Несмотря на исключение, commons-logging
указан в этот раз. Это может быть проблематично, так как это делает ваш путь к классам загрязненным зависимостями, которых там быть не должно. Вы можете обойти эту проблему, вручную сконфигурировав необходимые исключения в вашей сборке Gradle, но прежде всего вы должны знать, какими должны быть исключения, а затем вы должны пройти через утомительный и подверженный ошибкам процесс их настройки.
Соблюдение исключений пом
Плагин управления зависимостями изменяет обработку Gradle исключений пом, чтобы они вели себя как в Maven. С плагином, примененным к примеру проекта, он больше не тянет commons-logging
:
\--- com.example:my-library:0.0.1-SNAPSHOT +--- org.springframework:spring-core:4.1.4.RELEASE +--- org.springframework:spring-beans:4.1.4.RELEASE | \--- org.springframework:spring-core:4.1.4.RELEASE \--- org.slf4j:jcl-over-slf4j:1.7.10 \--- org.slf4j:slf4j-api:1.7.10
Учиться больше
В дополнение к функциям, описанным выше, плагин имеет поддержку для работы со свойствами bom (как переопределяя их, так и используя их в вашей сборке Gradle), автоматически включая метаданные управления зависимостями в сгенерированные Gradle pom-файлы и многое другое. Взгляните на README для более подробной информации.
Плагин имеет Apache-лицензию и находится на GitHub . GitHub также используется для отслеживания проблем . Всегда приветствуются предложения новых функций, запросы на извлечение и сообщения об ошибках.