最简单的版本声明是表示要使用的版本的简单字符串 . Gradle支持不同的方式来声明版本字符串:

  • 一个确切的版本:如1.31.3.0-beta31.0-20150201.131010-1

  • Maven样式的版本范围:例如[1.0,)[1.1, 2.0)(1.2, 1.5]

    • []符号表示包含范围; ()表示排他界限.

    • 如果缺少上限或下限,则范围没有上限或下限.

    • 可以使用符号]代替(表示排他性下限,使用[代替)表示排他性上限. 例如]1.0, 2.0[

  • 前缀版本范围:例如1.+1.3.+

    • 仅包含与+之前的部分完全匹配的版本.

    • 范围+本身将包含任何版本.

  • latest-status版本:例如, latest.integrationlatest.release

  • Maven SNAPSHOT版本标识符:例如1.0-SNAPSHOT1.4.9-beta1-SNAPSHOT

Version ordering

版本具有隐式排序. 版本排序用于:

  • 确定特定版本是否包含在范围内.

  • 解决冲突时,确定哪个版本是"最新的".

Versions are ordered based on the following rules:

  • 每个版本均分为其组成的"部分":

    • 字符[. - _ +] [. - _ +]用于分隔版本的不同"部分".

    • 同时包含数字和字母的任何部分都将分为以下各部分: 1a1 == 1.a.1

    • 仅比较版本的各个部分. 实际的分隔符并不重要: 1.a.1 == 1-a+1 == 1.a-1 == 1a1

  • 使用以下规则比较2个版本的等效部分:

    • 如果两个部分都是数字,则最高数值较高1.1 < 1.2

    • 如果一个部分是数字部分,则认为它高于非数字部分: 1.a < 1.1

    • 如果两者都不是数字, 1.B 字母顺序比较零件,区分大小写1.A < 1.B < 1.a < 1.b

    • 具有额外数​​字部分的版本被认为高于没有以下内容的版本: 1.1 < 1.1.0

    • 具有额外的非数字部分的版本被认为低于没有以下版本的版本: 1.1.a < 1.1

  • 某些字符串值出于排序目的具有特殊含义:

    • 字符串dev被认为低于任何其他字符串部分: 1.0-dev < 1.0-alpha < 1.0-rc .

    • 字符串rcreleasefinal被认为高于任何其他字符串部分(按此顺序排序): 1.0-zeta < 1.0-rc < 1.0-release < 1.0-final < 1.0 .

    • 字符串SNAPSHOT 没有特殊含义 ,并且像其他任何字符串部分一样按字母顺序排序: 1.0-alpha < 1.0-SNAPSHOT < 1.0-zeta < 1.0-rc < 1.0 .

    • 数值快照版本没有特殊含义 ,并且与任何其他数值部分一样排序: 1.0 < 1.0-20150201.121010-123 < 1.1 .

Simple version declaration semantics

使用缩写符号声明版本时,例如:

例子1.一个简单的声明
build.gradle
dependencies {
    implementation('org.slf4j:slf4j-api:1.7.15')
}
build.gradle.kts
dependencies {
    implementation("org.slf4j:slf4j-api:1.7.15")
}

随后的版本被认为是需要的版本 ,这意味着它应该最低限度1.7.15 ,但可以通过发动机(乐观升级)进行升级.

但是,对于严格的版本 ,有一个简写的表示法,使用!! 符号:

例子2.严格依赖的简写
build.gradle
dependencies {
    // short-hand notation with !!
    implementation('org.slf4j:slf4j-api:1.7.15!!')
    // is equivalent to
    implementation("org.slf4j:slf4j-api") {
        version {
           strictly '1.7.15'
        }
    }

    // or...
    implementation('org.slf4j:slf4j-api:[1.7, 1.8[!!1.7.25')
    // is equivalent to
    implementation('org.slf4j:slf4j-api') {
        version {
           strictly '[1.7, 1.8['
           prefer '1.7.25'
        }
    }
}
build.gradle.kts
dependencies {
    // short-hand notation with !!
    implementation("org.slf4j:slf4j-api:1.7.15!!")
    // is equivalent to
    implementation("org.slf4j:slf4j-api") {
        version {
           strictly("1.7.15")
        }
    }

    // or...
    implementation("org.slf4j:slf4j-api:[1.7, 1.8[!!1.7.25")
    // is equivalent to
    implementation("org.slf4j:slf4j-api") {
        version {
           strictly([1.7, 1.8[")
           prefer("1.7.25")
        }
    }
}

严格版本无法升级,并且会覆盖此依赖关系提供的所有传递依赖关系. 建议对严格版本使用范围.

上面的符号[1.7, 1.8[!!1.7.25等效于:

  • strictly [1.7, 1.8[

  • prefer 1.7.25

这意味着引擎必须在1.7(包括)和1.8(排除)之间选择一个版本,并且如果图中的其他组件都不需要其他版本,则它应该首选 1.7.25 .

Declaring a dependency without version

对于较大的项目,建议的做法是声明没有版本的依赖项,并将依赖项约束用于版本声明. 优势在于,依赖关系约束使您可以在一处管理所有依赖关系的版本,包括传递性.

例子3.声明一个没有版本的依赖
build.gradle
dependencies {
    implementation 'org.springframework:spring-web'
}

dependencies {
    constraints {
        implementation 'org.springframework:spring-web:5.0.2.RELEASE'
    }
}
build.gradle.kts
dependencies {
    implementation("org.springframework:spring-web")
}

dependencies {
    constraints {
        implementation("org.springframework:spring-web:5.0.2.RELEASE")
    }
}