Using a platform to control transitive versions

平台是一种特殊的软件组件,可用于控制传递依赖项版本. 在大多数情况下,它完全由依赖项约束组成,这将建议依赖项版本或强制执行某些版本. 因此,当您需要在项目之间共享依赖版本时,这是一个完美的工具. 在这种情况下,通常以这种方式组织项目:

  • 一个platform项目,该项目为在不同子项目中找到的各种依赖项定义了约束

  • 多个子项目,这些子项目依赖于平台并声明不带版本的依赖项

在Java生态系统中,Gradle为此提供了一个插件 .

找到发布为Gradle本地支持的 Maven BOM的平台也是很常见的.

使用platform关键字创建对platform依赖项:

示例1.获取在平台中声明的版本
build.gradle
dependencies {
    // get recommended versions from the platform project
    api platform(project(':platform'))
    // no version required
    api 'commons-httpclient:commons-httpclient'
}
build.gradle.kts
dependencies {
    // get recommended versions from the platform project
    api(platform(project(":platform")))
    // no version required
    api("commons-httpclient:commons-httpclient")
}

platform表示法是一种简写形式的表示法,它实际上在后台执行一些操作:

  • 它将org.gradle.category属性设置platform ,这意味着Gradle将选择依赖项的平台组件.

  • 它默认设置了endorseStrictVersions行为,这意味着如果平台声明了严格的依赖关系,则将强制执行它们.

这意味着默认情况下,对平台的依赖关系会触发该平台中定义的所有严格版本的继承,这对于平台作者确保所有使用者在依赖关系的版本方面都遵循自己的决定很有用. 可以通过显式调用doNotEndorseStrictVersions方法将其关闭.

Importing Maven BOMs

Gradle提供了对导入物料清单(BOM)文件的支持 ,该文件是有效的.pom文件,使用<dependencyManagement>来控制直接和传递依赖项的依赖项版本. 当依赖于Maven中的BOM时,Gradle中的BOM支持与使用<scope>import</scope>相似. 但是,在Gradle中,这是通过BOM上的常规依赖项声明完成的:

例子2.依靠一个BOM导入它的依赖约束
build.gradle
dependencies {
    // import a BOM
    implementation platform('org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE')

    // define dependencies without versions
    implementation 'com.google.code.gson:gson'
    implementation 'dom4j:dom4j'
}
build.gradle.kts
dependencies {
    // import a BOM
    implementation(platform("org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE"))

    // define dependencies without versions
    implementation("com.google.code.gson:gson")
    implementation("dom4j:dom4j")
}

在示例中,Spring Boot BOM提供了gsondom4j的版本. 这样,如果您正在开发像Spring Boot这样的平台,则不必自己声明任何版本,而可以依赖平台提供的版本.

Gradle处理BOM的<dependencyManagement>块中的所有条目类似于Gradle的依赖关系约束 . 这意味着<dependencyManagement>块中定义的任何版本都可能影响依赖性解析结果. 为了有资格作为BOM, .pom文件需要设置<packaging>pom</packaging> .

但是,BOM常常不仅提供建议的版本,而且还提供一种方法来覆盖图中找到的任何其他版本. 导入BOM时,可以通过使用enforcedPlatform关键字而不是platform来启用此行为:

示例3.导入BOM,确保其定义的版本覆盖找到的任何其他版本
build.gradle
dependencies {
    // import a BOM. The versions used in this file will override any other version found in the graph
    implementation enforcedPlatform('org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE')

    // define dependencies without versions
    implementation 'com.google.code.gson:gson'
    implementation 'dom4j:dom4j'

    // this version will be overridden by the one found in the BOM
    implementation 'org.codehaus.groovy:groovy:1.8.6'
}
build.gradle.kts
dependencies {
    // import a BOM. The versions used in this file will override any other version found in the graph
    implementation(enforcedPlatform("org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE"))

    // define dependencies without versions
    implementation("com.google.code.gson:gson")
    implementation("dom4j:dom4j")

    // this version will be overridden by the one found in the BOM
    implementation("org.codehaus.groovy:groovy:1.8.6")
}