當同一個程式庫被多次宣告,或當兩個不同的程式庫提供相同的功能時,可能會在相依性解析期間發生衝突。

了解衝突類型

在相依性解析期間,Gradle 處理兩種衝突類型

  1. 版本衝突:亦即當兩個或多個相依性需要給定的模組,但版本不同時。

  2. 功能衝突:亦即當相依性圖形包含多個提供相同功能的成品時。

解決版本衝突

當一個元件宣告了兩個相依性,而這兩個相依性

  • 相依於同一個模組,例如 com.google.guava:guava

  • 但版本不同,例如 20.025.1-android

    • 我們的專案本身相依於 com.google.guava:guava:20.0

    • 我們的專案也相依於 com.google.inject:guice:4.2.2,而後者本身相依於 com.google.guava:guava:25.1-android

Gradle 將考慮所有請求的版本,無論它們出現在相依性圖形中的哪個位置。預設情況下,它將選擇這些版本中最高的版本。

解決功能衝突

Gradle 使用屬性和功能來識別元件提供哪些成品。當相依性圖形中的兩個或多個元件變體宣告相同的功能時,就會發生功能衝突。

Gradle 通常會使建置失敗並報告衝突。

您可以透過在 resolutionStrategy 區塊中指定要使用的功能來手動解決衝突

configurations.configureEach {
    resolutionStrategy.capabilitiesResolution.withCapability("com.example:logging") {
        selectHighestVersion()
    }
}

了解相依性限制

為了協助 Gradle 解決相依性問題,提供了許多解決方案。

例如,dependencies 區塊提供了一個 constraints 區塊,可用於協助 Gradle 選擇特定版本的相依性

dependencies {
    constraints {
        implementation("org.apache.commons:commons-lang3:3.12.0")
    }
}

下一步: 了解相依性解析 >>