1. Введение
Spring Boot — отличный фреймворк для быстрого старта новых проектов. Одним из способов, которым он помогает разработчикам быстро создавать новые приложения, является определение набора зависимостей, подходящего для большинства пользователей.
Однако в некоторых случаях может потребоваться переопределить одну или несколько версий зависимостей .
В этом руководстве мы рассмотрим, как переопределить управляемые зависимости Spring Boot и их версии.
2. Список материалов Spring Boot (BOM)
Давайте начнем с рассмотрения того, как Spring Boot управляет зависимостями. Короче говоря, Spring Boot использует спецификацию (BOM) для определения зависимостей и версий.
Большинство проектов Spring Boot наследуются от артефакта spring-boot-starter-parent , который сам наследуется от артефакта spring-boot-dependencies . Этот последний артефакт — Spring Boot BOM , который представляет собой просто POM-файл Maven с большим разделом dependencyManagement :
<dependencyManagement>
<dependencies>
<dependency>
...
</dependency>
<dependency>
...
</dependency>
</dependencies>
</dependencyManagement>
С помощью зависимостей
Maven в BOM можно указать версии библиотек по умолчанию, если наше приложение решит их использовать . Давайте посмотрим на пример.
Одна из записей в Спецификации Spring Boot выглядит следующим образом:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-amqp</artifactId>
<version>${activemq.version}</version>
</dependency>
Это означает, что любой артефакт в проекте, который зависит от ActiveMQ, получит эту версию по умолчанию.
Также обратите внимание, что версия указывается с помощью заполнителя свойства . Это обычная практика в Спецификации Spring Boot, и она предоставляет значение для этого и других свойств в своем собственном разделе свойств .
3. Переопределение версий управляемых зависимостей Spring Boot
Теперь, когда мы понимаем, как Spring Boot управляет версиями зависимостей, давайте посмотрим, как мы можем их переопределить.
3.1. Мавен
Для Maven у нас есть два варианта переопределения управляемой зависимости Spring Boot. Во-первых, для любой зависимости, в которой Спецификация Spring Boot указывает версию с заполнителем свойства, нам просто нужно установить это свойство в POM нашего проекта :
<properties>
<activemq.version>5.16.3</activemq.version>
</properties>
Это приведет к тому, что любая зависимость, использующая свойство activemq.version
, будет использовать указанную нами версию вместо той, что указана в Спецификации Spring Boot.
Кроме того, если версия указана явно в теге зависимости
в спецификации, а не в качестве заполнителя, мы можем просто явно переопределить версию
в записи зависимости нашего проекта:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-amqp</artifactId>
<version>5.16.3</version>
</dependency>
3.2. Грейдл
Для Gradle требуется плагин для управления зависимостями из спецификации Spring Boot . Поэтому, чтобы начать, мы должны включить плагин и импортировать спецификацию:
apply plugin: "io.spring.dependency-management"
dependencyManagement {
imports {
mavenBom 'io.spring.platform:platform-bom:2.5.5'
}
}
Теперь, если мы хотим переопределить конкретную версию зависимости, нам просто нужно указать соответствующее свойство из спецификации как свойство Gradle ext
:
ext['activemq.version'] = '5.16.3'
И если в спецификации нет свойства для переопределения, мы всегда можем указать версию напрямую, когда объявляем зависимость:
compile 'org.apache.activemq:activemq-amqp:5.16.3'
3.3. Предостережения
Здесь стоит упомянуть несколько предостережений.
Для начала важно помнить, что Spring Boot собирается и тестируется с использованием версий библиотек, указанных в их спецификации. Каждый раз, когда мы указываем другую версию библиотеки, существует риск возникновения несовместимости. Поэтому очень важно тестировать наши приложения каждый раз, когда мы отклоняемся от стандартных версий зависимостей.
Также помните, что эти советы применимы только тогда, когда мы используем Спецификацию материалов (BOM) Spring Boot . Для Maven это означает использование родителя Spring Boot. А для Gradle это означает использование плагина зависимостей Spring.
4. Поиск версий зависимостей
Мы увидели, как Spring Boot управляет версиями зависимостей и как мы можем их переопределить. В этом разделе мы рассмотрим, как найти версию библиотеки, которую использует наш проект. Это полезно для определения версий библиотек и подтверждения того, что любые переопределения, которые мы применяем к проекту, соблюдаются.
4.1. Мавен
Maven предоставляет цель , которую мы можем использовать для отображения списка всех зависимостей и их версий. Например, если мы запустим команду:
mvn dependency:tree
Мы должны увидеть вывод, похожий на:
[INFO] com.foreach:dependency-demo:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.5.7-SNAPSHOT:compile
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.5.7-SNAPSHOT:compile
[INFO] | | +- org.springframework.boot:spring-boot:jar:2.5.7-SNAPSHOT:compile
[INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.5.7-SNAPSHOT:compile
[INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:2.5.7-SNAPSHOT:compile
[INFO] | | | +- ch.qos.logback:logback-classic:jar:1.2.6:compile
[INFO] | | | | \- ch.qos.logback:logback-core:jar:1.2.6:compile
Вывод показывает все артефакты и версии, которые являются зависимостями проекта. Эти зависимости представлены в виде древовидной структуры , что позволяет легко определить, как каждый артефакт импортируется в проект.
В приведенном выше примере артефакт logback-classic
является зависимостью библиотеки spring-boot-starter-logging
, которая сама является зависимостью модуля spring-boot-starter .
Таким образом, мы можем вернуться вверх по дереву к нашему проекту верхнего уровня.
4.2. Грейдл
Gradle предоставляет задачу, которая создает аналогичное дерево зависимостей. Например, если мы запустим команду:
gradle dependencies
Мы получим вывод, похожий на:
compileClasspath - Compile classpath for source set 'main'.
\--- org.springframework.boot:spring-boot-starter-web -> 1.3.8.RELEASE
+--- org.springframework.boot:spring-boot-starter:1.3.8.RELEASE
| +--- org.springframework.boot:spring-boot:1.3.8.RELEASE
| | +--- org.springframework:spring-core:4.2.8.RELEASE
| | \--- org.springframework:spring-context:4.2.8.RELEASE
| | +--- org.springframework:spring-aop:4.2.8.RELEASE
Как и в выводе Maven, мы можем легко определить, почему каждый артефакт втягивается в проект вместе с используемой версией.
5. Вывод
В статье мы узнали, как Spring Boot управляет версиями зависимостей. Мы также увидели, как переопределить эти версии зависимостей как в Maven, так и в Gradle. Наконец, мы увидели, как можно проверить версии зависимостей в проектах обоих типов.