平台和版本目錄都有助於管理專案中的依賴版本,但它們有不同的用途,並且對依賴關係解析有不同的影響

版本目錄

  • 用途: 版本目錄集中並標準化依賴關係座標(群組、名稱、版本),並在建置腳本中提供類型安全的存取器,使依賴關係更易於管理。

  • 對依賴關係圖的影響: 版本目錄不會直接影響依賴關係解析。目錄中定義的版本必須在 dependencies 區塊中明確引用,一旦引用,它們的行為與任何本地宣告的依賴關係相同。此外,目錄的內容對下游消費者是透明的,這表示消費者無法識別依賴關係是本地宣告還是來自目錄。

libs.versions.toml
[libraries]
mylib = { group = "com.example", name = "mylib", version = "1.0.0" }

平台

  • 用途: 平台是依賴關係圖中的一個模組,用於強制或對齊依賴關係(包括傳遞依賴關係)的版本。它會影響依賴關係解析,並確保不同模組之間的版本一致性。

  • 對依賴關係圖的影響: 平台會應用強制版本到本地宣告但未指定版本的依賴關係。平台中的這些版本會透過依賴關係圖傳播,影響傳遞依賴關係和下游消費者。它們是依賴關係圖的正式部分,可以決定解析期間選擇的版本。

build.gradle.kts
plugins {
    `java-platform`
}

dependencies {
    constraints {
        api("com.example:mylib:2.0.0")
    }
}

搭配目錄使用平台

即使版本目錄為依賴關係定義了版本,如果另一個組件(例如平台或傳遞依賴關係)建議不同的版本,Gradle 也可能會在解析期間選擇不同的版本(除非使用 enforcedPlatform)。

例如,版本目錄可能將 mylib 定義為版本 1.0.0,但如果平台強制使用 2.0.0,Gradle 將選擇版本 2.0.0

為了確保一致的版本對齊,一個好的方法是使用版本目錄來定義依賴關係版本,同時使用平台來強制執行它們。

版本目錄

gradle/libs.versions.toml
[versions]
junit-jupiter = "5.10.3"

[libraries]
guava = { module = "com.google.guava:guava"}
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" }
junit-jupiter-launcher = { module = "org.junit.platform:junit-platform-launcher" }

平台

platform/build.gradle.kts
plugins {
    `java-platform`
}

javaPlatform {
    allowDependencies()
}

dependencies {
    constraints {
        api("org.junit.jupiter:junit-jupiter:5.11.1") // Enforcing specific version
        api("com.google.guava:guava:[33.1.0-jre,)") // Enforcing version range
    }
}
platform/build.gradle
plugins {
    id 'java-platform'
}

javaPlatform {
    allowDependencies()
}

dependencies {
    constraints {
        api 'org.junit.jupiter:junit-jupiter:5.11.1' // Enforcing specific version
        api 'com.google.guava:guava:[33.1.0-jre,)' // Enforcing version range
    }
}

消費者

consumer/build.gradle.kts
dependencies {
    // Platform
    implementation(platform(project(":platform")))
    // Catalog
    testImplementation(libs.junit.jupiter)
    testRuntimeOnly(libs.junit.jupiter.launcher)
    implementation(libs.guava)
}
consumer/build.gradle
dependencies {
    // Platform
    implementation platform(project(":platform"))
    // Catalog
    testImplementation libs.junit.jupiter
    testRuntimeOnly libs.junit.jupiter.launcher
    implementation libs.guava
}

同時使用目錄和平台的最佳實務

  1. 使用版本目錄來定義和跨專案共享依賴關係座標。它們使依賴關係宣告保持一致且更易於管理,但不保證版本對齊。

  2. 當您需要影響或強制跨模組的版本對齊時,使用平台。平台確保依賴關係解析為所需的版本,尤其是在大型或多模組專案中。