В старых Spring Framework приложениях часто возникала проблема согласования версий зависимостей. Например, если в проекте используется org.springframework.data:spring-data-jpa той или иной версии, то к этой зависимости нужно подобрать в пару org.hibernate.orm:hibernate-core какой-то подходящей версии.
Spring Boot решил эту проблему не только для собственно Spring Boot приложений, но также и для Spring Framework приложений.
Spring Boot Maven parent
Создавая новое приложение в Spring initializr, мы получаем готовое решение вопроса версий зависимостей. Часть файла pom.xml будет выглядеть примерно следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
... <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> ... <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ... |
Артефакт spring-boot-starter-parent объявляется родительским артефактом для приложения. Добавляемые стартеры (в нашем примере — spring-boot-starter-data-jpa) не снабжаются версиями. Версии входящих в состав стартера джарников определяются версией родительского артефакта.
И, действительно, если посмотреть на список загруженных зависимостей, то у всех у них, разумеется, есть номера версий:
Если есть основания полагать, что та или иная зависимость должна иметь другую версию, то её можно исключить из стартера и подключить напрямую:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> <version>6.1.7.Final</version> </dependency> |
Spring Boot Maven dependencyManagement
Если по каким-то причинам артефакт spring-boot-starter-parent не может быть родительским для приложения, то добиться аналогичного эффекта с автоматическим подбором версий зависимостей можно с помощью узла <dependencyManagement> в файле pom.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
... <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.1.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ... |
Spring Framework Maven dependencyManagement
Очень удобно, что узел <dependencyManagement> может быть использован для автоматического подбора подходящих зависимостей и в Spring Framework приложениях. Рассмотрим следующий фрагмент файла pom.xml не Spring Boot приложения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
... <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.1.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> </dependency> <dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> </dependency> </dependencies> ... |
Обратите внимание, что была подобрана версия не только для джарника spring-data-jpa, который является частью проекта Spring, но и для джарника hibernate-core, который частью проекта не является, но является транзитивной зависимостью для некоторых компонент Spring Framework.
Gradle
В gradle для создания Spring Framework/Boot приложений используются соответствующие плагины:
1 2 3 4 5 6 7 8 9 10 |
plugins { id 'java' id 'org.springframework.boot' version '3.1.2' id 'io.spring.dependency-management' version '1.1.2' } ... dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' } |
Аналогично ситуации с Maven, чтобы использовать автоматический подбор версий зависимостей, gradle-проект не обязательно должен быть Spring Boot приложением. Автоматический подбор сработает и для Spring Framework приложения:
1 2 3 4 5 6 7 8 9 10 |
plugins { id 'java' id 'org.springframework.boot' version '3.1.2' id 'io.spring.dependency-management' version '1.1.2' } ... dependencies { implementation 'org.springframework.data:spring-data-jpa' implementation 'org.hibernate.orm:hibernate-core' } |