Managing dependencies
You have already learned earlier in the chapter that we can refactor the dependency definitions by extracting common parts into project properties. This way, we only have to change a few project property values to make changes to multiple dependencies. In the next example build file, we will use lists to group dependencies together and reference those lists from the dependency definition:
ext { // Group is used multiple times, so // we extra the variable for re-use. def vehiclesGroup = 'com.vehicles' // libs will be available from within // the Gradle script code, like dependencies {...}. libs = [ vehicles: [ [group: vehiclesGroup, name: 'car', version: '2.0'], [group: vehiclesGroup, name: 'truck', version: '1.0'] ], traffic: [ [group: 'com.traffic', name: 'pedestrian', version: '1.0'] ] ] } configurations { vehicles } dependencies { // Reference ext.libs.vehicles defined earlier // in the build script. vehicles libs.vehicles }
Maven has a feature called dependency management metadata that allows us to define versions used for dependencies in a common part of the build file. Then, when the actual dependency is configured, we can leave out the version because it will be determined from the dependency management section of the build file. Gradle doesn't have such a built-in feature, but as illustrated earlier, we can use simple code refactoring to get a similar effect.
We can still have declarative dependency management, as we do in Maven, in our Gradle build, with the external dependency management plugin by Spring. This plugin adds a dependencyManagement
configuration block to Gradle. Inside the configuration block, we can define dependency metadata, such as the group, name, and version. In the dependencies
configuration closure in our Gradle build script, we don't have to specify the version anymore because it will be resolved via the dependency metadata in the dependencyManagement
configuration. The following example build file uses this plugin and specifies dependency metadata using dependencyManagement
:
buildscript { repositories { // Specific repository to find and download // dependency-management-plugin. maven { url 'http://repo.spring.io/plugins-snapshot' } } dependencies { // Define external module dependency with plugin. classpath 'io.spring.gradle:dependency-management-plugin:0.1.0.RELEASE' } } // Apply the external plugin dependency-management. apply plugin: 'io.spring.dependency-management' apply plugin: 'java' repositories { // Repository for downloading dependencies. jcenter() } // This block is added by the dependency-management // plugin to define dependency metadata. dependencyManagement { dependencies { // Specify group:name followed by required version. 'org.springframework.boot:spring-boot-starter-web' '1.1.5.RELEASE' // If we have multiple module names for the same group // and version we can use dependencySet. dependencySet(group: 'org.springframework.boot', version: '1.1.5.RELEASE') { entry 'spring-boot-starter-web' entry 'spring-boot-starter-actuator' } } } dependencies { // Version is resolved via dependencies metadata // defined in dependencyManagement. compile 'org.springframework.boot:spring-boot-starter-web' }
To import a Maven bill of materials (BOM) provided by an organization, we can use the imports
method inside the dependencyManagement
configuration. In the next example, we will use the Spring IO platform BOM. In the dependencies
configuration, we can leave out the version because it will be resolved via the BOM:
buildscript { repositories { // Specific repository to find and download // dependency-management-plugin. maven { url 'http://repo.spring.io/plugins-snapshot' } } dependencies { // Define external module dependency with plugin. classpath 'io.spring.gradle:dependency-management-plugin:0.1.0.RELEASE' } } // Apply the external plugin dependency-management. apply plugin: 'io.spring.dependency-management' apply plugin: 'java' repositories { // Repository for downloading BOM and dependencies. jcenter() } // This block is added by the dependency-management // plugin to define dependency metadata. dependencyManagement { imports { // Use Maven BOM provided by Spring IO platform. mavenBom 'io.spring.platform:platform-bom:1.0.1.RELEASE' } } dependencies { // Version is resolved via Maven BOM. compile 'org.springframework.boot:spring-boot-starter-web' }