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

  • 精确版本:例如1.3, 1.3.0-beta3,1.0-20150201.131010-1

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

    • [符号]表示包含边界;()指示排它边界。

    • 当上限或下限缺失时,范围没有上限或下限。

    • 该符号]可以用来代替(排它下界,也[可以代替)排它上限。例如]1.0, 2.0[

    • 上限排除充当前缀排除。这意味着[1.0, 2.0[还将排除所有以2.0小于2.0.例如,类似2.0-dev1或 的版本2.0-SNAPSHOT不再包含在该范围内。

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

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

    • 该范围+本身将包括任何版本。

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

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

版本订购

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

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

  • 执行冲突解决时确定哪个版本是“最新”(但请注意,冲突解决使用 “基本版本”)。

版本根据以下规则排序:

  • 每个版本都分为其组成“部分”:

    • 这些字符[. - _ +]用于分隔版本的不同“部分”。

    • 任何包含数字和字母的部分都会被分成单独的部分:1a1 == 1.a.1

    • 仅比较版本的部分内容。实际的分隔符并不重要:(1.a.1 == 1-a+1 == 1.a-1 == 1a1但请注意,在冲突解决的上下文中,此规则有例外)。

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

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

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

    • 如果两者都是非数字,则按字母顺序比较各部分,并区分大小写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-alpha< 1.0-rc

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

    • 与常规字符串部分相反,这些特殊值不区分大小写1.0-RC-1,并且它们不依赖于它们周围使用的分隔符: ==1.0.rc.1

简单版本声明语义

当您使用简写符号声明版本时,例如:

build.gradle.kts
dependencies {
    implementation("org.slf4j:slf4j-api:1.7.15")
}
build.gradle
dependencies {
    implementation('org.slf4j:slf4j-api:1.7.15')
}

然后该版本被认为是必需版本,这意味着它至少应该是1.7.15但可以由引擎升级(乐观升级)。

然而,严格版本有一个简写符号,使用以下!!符号:

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")
        }
    }
}
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'
        }
    }
}

严格版本无法升级,并且会覆盖源自此依赖项提供的任何传递依赖项。建议对严格版本使用范围。

上面的符号[1.7, 1.8[!!1.7.25相当于:

  • 严格地[1.7, 1.8[

  • 更喜欢1.7.25

这意味着引擎必须选择 1.7(包含)和 1.8(排除)之间的版本,并且如果图中没有其他组件需要不同的版本,则它应该更喜欢 1.7.25.

声明没有版本的依赖项

对于较大的项目,推荐的做法是声明不带版本的依赖项,并使用依赖项约束进行版本声明。优点是依赖项约束允许您在一个地方管理所有依赖项的版本,包括传递依赖项。

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

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

dependencies {
    constraints {
        implementation 'org.springframework:spring-web:5.0.2.RELEASE'
    }
}