使用 main Gradle 项目定义所有依赖版本

Use main Gradle project to define all dependencies versions

我想创建一个主要的 Gradle 项目来托管所有项目依赖项:

主要Gradle项目:

plugins {
    id 'org.springframework.boot' version '2.6.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'maven-publish'
}

group = 'com.parent.dependencies'
version = '0.0.1'
sourceCompatibility = '11'

ext {
    set('springCloudVersion', "2021.0.1")
    artifactory_contextUrl = "http://192.168.1.112/repository"
}

repositories {
    mavenCentral()
    maven {
        url "${artifactory_contextUrl}/plugins-release"
        allowInsecureProtocol = true
    }
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.threeten:threetenbp:1.5.1'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    // Lombok
    compileOnly 'org.projectlombok:lombok:1.18.22'
    annotationProcessor 'org.projectlombok:lombok:1.18.22'
    testCompileOnly 'org.projectlombok:lombok:1.18.22'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
    // Swagger
    implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0'
    implementation 'org.springframework.boot:spring-boot-starter-hateoas:2.6.3'
    implementation group: 'com.netflix.hystrix', name: 'hystrix-core', version: '1.5.18'
    implementation group: 'org.springframework.security', name: 'spring-security-core', version: '5.6.1'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
    resolutionStrategy {
        cacheDynamicVersionsFor 0, "seconds"
        cacheChangingModulesFor 0, "seconds"
    }
}

bootJar {
    enabled = false
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
    repositories {
        mavenLocal()
    }
}

test {
    useJUnitPlatform()
}

将从父 Gradle 项目读取所有依赖项版本的子项目:

plugins {
    id 'org.springframework.boot' version '2.6.4'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'maven-publish'
}

group = 'com.child'
version = '0.0.1'
sourceCompatibility = '11'

ext {
    artifactory_contextUrl = "http://192.168.1.112/repository"
}

repositories {
    mavenCentral()
    maven {
        url "${artifactory_contextUrl}/plugins-release"
        allowInsecureProtocol = true
    }
}

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.threeten:threetenbp'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    // Lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testCompileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    // Swagger
    implementation 'io.springfox:springfox-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-hateoas'
    implementation 'com.netflix.hystrix:hystrix-core'
    implementation 'org.springframework.security:spring-security-core'
    testImplementation 'org.junit.jupiter:junit-jupiter-api'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}

dependencyManagement {
    imports {
        mavenBom "com.parent:com-parent-dependencies:0.0.1"
    }
}

bootJar {
    enabled = false
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
    repositories {
        mavenLocal()
    }
}

test {
    useJUnitPlatform()
}

当我尝试编译子项目时出现错误:

Execution failed for task ':compileJava'.
> Could not resolve all files for configuration ':compileClasspath'.
   > Could not find org.threeten:threetenbp:.
     Required by:
         project :
   > Could not find io.springfox:springfox-boot-starter:.
     Required by:
         project :
   > Could not find com.netflix.hystrix:hystrix-core:.
     Required by:
         project :

你知道我如何正确定义具有所有依赖版本的父 Gradle 项目并在不定义依赖版本的情况下使用子项目吗?

有一个相对较新的 Gradle 功能称为“版本目录”。有了这些,您可以 centrally declare dependencies that you’d like to share between multiple projects of your build (or even between different builds).

在您的具体示例中,您将向 settings.gradle 文件中添加如下内容:

dependencyResolutionManagement {
    versionCatalogs {
        libs {
            library('spring-cloud-bom', 'org.springframework.cloud:spring-cloud-dependencies:2021.0.1')
            library('spring-cloud-starter', 'org.springframework.cloud', 'spring-cloud-starter-netflix-eureka-client').withoutVersion()
            library('spring-boot-starter-validation', 'org.springframework.boot', 'spring-boot-starter-validation').withoutVersion()
            library('spring-boot-starter-test', 'org.springframework.boot', 'spring-boot-starter-test').withoutVersion()
            library('threetenbp', 'org.threeten:threetenbp:1.5.1')
            library('spring-boot-starter-actuator', 'org.springframework.boot', 'spring-boot-starter-actuator').withoutVersion()
            library('lombok', 'org.projectlombok:lombok:1.18.22')
            library('springfox-boot-starter', 'io.springfox:springfox-boot-starter:3.0.0')
            library('spring-boot-starter-hateoas', 'org.springframework.boot:spring-boot-starter-hateoas:2.6.3')
            library('hysterix-core', 'com.netflix.hystrix:hystrix-core:1.5.18')
            library('spring-security-core', 'org.springframework.security:spring-security-core:5.6.1')
            library('junit-jupiter-api', 'org.junit.jupiter:junit-jupiter-api:5.8.2')
            library('junit-jupiter-engine', 'org.junit.jupiter:junit-jupiter-engine:5.8.2')
        }
    }
}

然后,在两个 build.gradle 文件中,将 dependencies 块替换为以下内容:

dependencies {
    implementation libs.spring.cloud.starter
    implementation libs.spring.boot.starter.validation
    testImplementation libs.spring.boot.starter.test
    implementation libs.threetenbp
    implementation libs.spring.boot.starter.actuator
    // Lombok
    compileOnly libs.lombok
    annotationProcessor libs.lombok
    testCompileOnly libs.lombok
    testAnnotationProcessor libs.lombok
    // Swagger
    implementation libs.springfox.boot.starter
    implementation libs.spring.boot.starter.hateoas
    implementation libs.hysterix.core
    implementation libs.spring.security.core
    testImplementation libs.junit.jupiter.api
    testRuntimeOnly libs.junit.jupiter.engine
}

当您为 Spring 使用 Maven BOM 时,您还必须在所有项目中使用以下更新的 dependencyManagement 块:

dependencyManagement {
    imports {
        mavenBom libs.spring.cloud.bom.get().toString()
    }
    resolutionStrategy {
        cacheDynamicVersionsFor 0, "seconds"
        cacheChangingModulesFor 0, "seconds"
    }
}

应该是这样。我至少可以在 Gradle 7.4.

上使用我的更新成功测试您的示例构建配置