相依性限制的功能與 相依性 類似,主要區別在於它們本身不引入相依性。相反地,限制定義了版本需求,當透過其他方式將相依性引入專案時,這些需求會影響解析過程。

雖然預設情況下限制不是嚴格版本,但如果需要,您可以指定嚴格版本限制。一旦包含相依性,限制指定的版本就會參與衝突解決,就像它是宣告為直接相依性一樣。

在開發單一專案程式庫時,限制可以直接與直接相依性一起宣告。但是,在開發多專案程式庫和應用程式時,最好在 平台 中集中宣告相依性

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

dependencies {
    constraints {
        // Platform declares some versions of libraries used in subprojects
        api("commons-httpclient:commons-httpclient:3.1")
        api("org.apache.commons:commons-lang3:3.8.1")
    }
}
build.gradle
plugins {
    id 'java-platform'
}

dependencies {
    constraints {
        // Platform declares some versions of libraries used in subprojects
        api 'commons-httpclient:commons-httpclient:3.1'
        api 'org.apache.commons:commons-lang3:3.8.1'
    }
}

一般而言,相依性分為直接可轉移

  • 直接相依性是指在組件的建置或中繼資料中明確指定的相依性。

  • 可轉移相依性不是直接指定的;它們會作為直接相依性的相依性自動拉入。

組件可能需要直接和可轉移相依性才能編譯或執行。

宣告與直接相依性並行的限制

相依性限制允許您為特定相依性定義版本或版本範圍,無論何時在解析期間遇到該相依性

這是跨多個配置或專案管理組件版本的首選方法。

當 Gradle 解析模組版本時,它會考慮所有相關因素,包括 豐富版本、可轉移相依性和該模組的相依性限制。選擇符合所有條件的最高版本。如果不存在此版本,Gradle 將會失敗並顯示錯誤,詳細說明衝突的宣告。

在這種情況下,您可以調整您的相依性宣告、相依性限制,或對可轉移相依性進行必要的變更。

與相依性宣告一樣,相依性限制也按配置劃分範圍,允許您選擇性地將它們應用於建置的特定部分。

constraints{} 區塊用於 dependencies{} 區塊中,以宣告這些限制

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

dependencies {
    constraints {
        api("commons-httpclient:commons-httpclient:3.1")
        runtime("org.postgresql:postgresql:42.2.5")
    }
}
build.gradle
plugins {
    id 'java-platform'
}

dependencies {
    constraints {
        api 'commons-httpclient:commons-httpclient:3.1'
        runtime 'org.postgresql:postgresql:42.2.5'
    }
}
  1. api("commons-httpclient:commons-httpclient:3.1"):

    • 此行在 api 配置上建立限制,聲明如果 commons-httpclient 曾經由擴展 api 配置的可解析配置解析,則其版本必須為 3.1 或更高。

    • 如果可轉移相依性(相依性的相依性)或專案中的另一個模組拉入不同版本的 commons-httpclient,Gradle 會強制執行相依性以解析為至少版本 3.1

    • 此限制確保程式庫 commons-httpclient 在所有擴展 api 配置的配置中,版本至少為 3.1

  2. runtime("org.postgresql:postgresql:42.2.5"):

    • 同樣地,此行在 runtime 配置上套用限制,強制 org.postgresql:postgresql 必須解析為至少版本 42.2.5

    • 即使專案中的其他相依性或模組嘗試引入不同版本的 postgresql,Gradle 也會選擇 42.2.5 和其他宣告版本中較高的版本。

    • 這確保了 postgresql 上的任何執行階段相依性都將解析為至少版本 42.2.5,跨越所有擴展 runtime 配置的可解析配置。

新增對可轉移相依性的限制

相依性管理問題通常源自可轉移相依性。開發人員有時會錯誤地透過新增直接相依性來解決這些問題,而不是使用限制來正確處理它們。

相依性限制允許您控制可轉移相依性的選擇。

在以下範例中,commons-codec:1.11 的版本限制僅在 commons-codec 作為可轉移相依性引入時才適用,因為它未在專案中直接宣告為相依性。如果 commons-codec 不是以可轉移方式拉入,則限制無效

build.gradle.kts
dependencies {
    implementation("org.apache.httpcomponents:httpclient")
    constraints {
        implementation("org.apache.httpcomponents:httpclient:4.5.3") {
            because("previous versions have a bug impacting this application")
        }
        implementation("commons-codec:commons-codec:1.11") {
            because("version 1.9 pulled from httpclient has bugs affecting this application")
        }
    }
}
build.gradle
dependencies {
    implementation 'org.apache.httpcomponents:httpclient'
    constraints {
        implementation('org.apache.httpcomponents:httpclient:4.5.3') {
            because 'previous versions have a bug impacting this application'
        }
        implementation('commons-codec:commons-codec:1.11') {
            because 'version 1.9 pulled from httpclient has bugs affecting this application'
        }
    }
}

相依性限制也可以定義 豐富版本 限制並支援 嚴格版本,允許您強制執行特定版本,即使它與可轉移相依性的版本衝突(例如,如果需要降級)。

相依性限制僅在使用 Gradle 模組中繼資料 時發佈。這表示只有在同時使用 Gradle 發佈和取用模組時,才能完全支援它們。如果模組是使用 Maven 或 Ivy 取用,則限制可能不會保留。

相依性限制是可轉移的。如果 程式庫 A 依賴於 程式庫 B,且 程式庫 B模組 C 上宣告了限制,則該限制將影響 程式庫 A 依賴的 模組 C 版本。

例如,如果 程式庫 A 依賴於 模組 C 版本 2,但 程式庫 B模組 C 版本 3 上宣告了限制,則 程式庫 A 將解析 模組 C 的版本 3