最簡單的版本宣告是一個代表要使用的版本的簡單字串。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.0, 2.0[ 也會排除所有以 2.0 開頭且小於 2.0 的版本。例如 2.0-dev12.0-SNAPSHOT 等版本將不再包含在範圍內。

  • 前綴版本範圍:例如 1.1.3.

    • 只有與 + 之前的部分完全相符的版本會被包含。

    • 範圍 + 本身會包含任何版本。

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

  • Maven SNAPSHOT 版本識別碼:例如 1.0-SNAPSHOT1.4.9-beta1-SNAPSHOT

版本排序

版本有內含的排序。版本排序用於

  • 確定特定版本是否包含在範圍內。

  • 在執行衝突解決時確定哪個版本是「最新」的(但要注意,衝突解決會使用 「基本版本」)。

版本根據下列規則排序

  • 每個版本都會分割成其組成「部分」

    • 字元 [. - _ +] 用來分隔版本的不同「部分」。

    • 任何同時包含數字和字母的部分會分割成各自分開的部分:1a1 == 1.a.1

    • 只會比對版本的各個部分。實際的分隔字元並無意義:1.a.1 == 1-a+1 == 1.a-1 == 1a1(但要注意,在衝突解決的脈絡中,有 例外)。

  • 2 個版本的等效部分會使用下列規則比對

    • 如果 2 個部分都是數字,數字值最高者為較高1.1 < 1.2

    • 如果一個部分是數字,則會被視為較高於非數字部分:1.a < 1.1

    • 如果 2 個部分都是非數字,則會以字母順序大小寫敏感的方式比對:1.A < 1.B < 1.a < 1.b

    • 具有額外數字部分的版本會被視為較高於沒有數字部分的版本(即使是 0):1.1 < 1.1.0

    • 具有額外非數字部分的版本會被視為較低於沒有數字部分的版本:1.1.a < 1.1

  • 某些非數字部分在排序時具有特殊意義

    • dev 被視為較低於任何其他非數字部分:1.0-dev < 1.0-ALPHA < 1.0-alpha < 1.0-rc

    • 字串 rcsnapshotfinalgareleasesp 被視為比任何其他字串部分(按此順序排列)更高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

簡單版本宣告語意

當您使用簡寫符號宣告版本時,例如

範例 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'
    }
}