平台和版本目錄都有助於管理專案中的依賴版本,但它們有不同的用途,並且對依賴關係解析有不同的影響
版本目錄
-
用途: 版本目錄集中並標準化依賴關係座標(群組、名稱、版本),並在建置腳本中提供類型安全的存取器,使依賴關係更易於管理。
-
對依賴關係圖的影響: 版本目錄不會直接影響依賴關係解析。目錄中定義的版本必須在
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
}
同時使用目錄和平台的最佳實務
-
使用版本目錄來定義和跨專案共享依賴關係座標。它們使依賴關係宣告保持一致且更易於管理,但不保證版本對齊。
-
當您需要影響或強制跨模組的版本對齊時,使用平台。平台確保依賴關係解析為所需的版本,尤其是在大型或多模組專案中。