如何在 Gradle 中配置條件依賴
一、概述
在本教程中,我們將了解如何在 Gradle 項目中配置條件依賴項。
2. 項目設置
我們將為演示設置一個多模塊項目。讓我們前往[start.spring.io](https://start.spring.io/)
並創建我們的根項目conditional-dependency-demo
。我們將使用 Gradle 和 Java 以及 Spring Boot。
讓我們還添加兩個提供者模塊, provider1
和provider2,
以及兩個消費者模塊, consumer1
和consumer2
:
3. 配置條件依賴
假設,基於項目屬性,我們想要包含兩個提供程序模塊之一。對於我們的consumer1
模塊,如果指定了屬性isLocal
,我們希望包含provider1
模塊。否則,應該包含provider2
模塊。
為此,讓我們在consumer1
模塊的gradle.settings.kts
文件中添加以下內容:
plugins {
id("java")
}
group = "com.baeldung.gradle"
version = "0.0.1-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0")
testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.7.0")
if (project.hasProperty("isLocal")) {
implementation("com.baeldung.gradle:provider1")
} else {
implementation("com.baeldung.gradle:provider2")
}
}
tasks.getByName<Test>("test") {
useJUnitPlatform()
}
現在,讓我們運行依賴項任務來查看選擇了哪個提供程序模塊:
gradle -PisLocal dependencies --configuration implementation
> Task :consumer1:dependencies
------------------------------------------------------------
Project ':consumer1'
------------------------------------------------------------
implementation - Implementation only dependencies for source set 'main'. (n)
\--- com.baeldung.gradle:provider1 (n)
(n) - Not resolved (configuration is not meant to be resolved)
A web-based, searchable dependency report is available by adding the --scan option.
BUILD SUCCESSFUL in 591ms
1 actionable task: 1 executed
正如我們所見,傳遞屬性導致包含provider1
模塊。現在讓我們在沒有指定任何屬性的情況下運行依賴項任務:
gradle dependencies --configuration implementation
> Task :consumer1:dependencies
------------------------------------------------------------
Project ':consumer1'
------------------------------------------------------------
implementation - Implementation only dependencies for source set 'main'. (n)
\--- com.baeldung.gradle:provider2 (n)
(n) - Not resolved (configuration is not meant to be resolved)
A web-based, searchable dependency report is available by adding the --scan option.
BUILD SUCCESSFUL in 649ms
1 actionable task: 1 executed
正如我們所見, provider2
現在被包括在內。
4. 通過模塊替換配置條件依賴
讓我們看看另一種通過依賴替換有條件地配置依賴的方法。對於我們的consumer2
模塊,如果指定了isLocal
屬性,我們希望包含provider2
模塊。否則,應使用模塊provider1
。
讓我們將以下配置添加到我們的consumer2
模塊中以實現此目標:
plugins {
id("java")
}
group = "com.baeldung.gradle"
version = "0.0.1-SNAPSHOT"
repositories {
mavenCentral()
}
configurations.all {
resolutionStrategy.dependencySubstitution {
if (project.hasProperty("isLocal"))
substitute(project("com.baeldung.gradle:provider1"))
.using(project(":provider2"))
.because("Project property override(isLocal).")
}
}
dependencies {
implementation(project(":provider1"))
testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0")
}
tasks.getByName<Test>("test") {
useJUnitPlatform()
}
現在,如果我們再次運行相同的命令,我們應該會得到類似的結果。讓我們首先使用指定的isLocal
屬性運行:
gradle -PisLocal dependencies --configuration compilePath
> Task :consumer2:dependencies
------------------------------------------------------------
Project ':consumer2'
------------------------------------------------------------
compileClasspath - Compile classpath for source set 'main'.
\--- project :provider1 -> project :provider2
A web-based, searchable dependency report is available by adding the --scan option.
BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
果然,我們看到provider1
項目被provider2
項目取代。現在讓我們在沒有指定屬性的情況下試試這個:
gradle dependencies --configuration compilePath
> Task :consumer2:dependencies
------------------------------------------------------------
Project ':consumer2'
------------------------------------------------------------
compileClasspath - Compile classpath for source set 'main'.
\--- project :provider1
A web-based, searchable dependency report is available by adding the --scan option.
BUILD SUCCESSFUL in 623ms
1 actionable task: 1 executed
正如預期的那樣,這次沒有進行替換,並且包括了provider1
。
5. 兩種方法的區別
正如我們在上面的演示中看到的,這兩種方法都幫助我們實現了有條件地配置依賴項的目標。讓我們談談這兩種方法之間的一些差異。
首先,與第二種方法相比,直接編寫條件邏輯看起來更簡單,配置更少。
其次,雖然第二種方法涉及更多配置,但似乎更慣用。在第二種方法中,我們利用了 Gradle 本身提供的替換機制。它還允許我們指定替換的原因。此外,在日誌中,我們可以注意到發生了替換,這與第一種方法不同,沒有此類信息可用:
compileClasspath - Compile classpath for source set 'main'.
\--- project :provider1 -> project :provider2
我們還要注意,在第一種方法中,不需要依賴解析。我們可以通過以下方式獲得結果:
gradle -PisLocal dependencies --configuration implementation
而在第二種方法中,如果我們要檢查implementation
配置,我們將看不到預期的結果。原因是它僅在依賴解析發生時才有效。因此,它可用於compilePath
配置:
gradle -PisLocal dependencies --configuration compilePath
六,結論
有了這個,我們就可以結束這篇文章了。在本文中,我們看到了兩種在 Gradle 中有條件地配置依賴項的方法。我們還分析了兩者的區別。
Gradle 提供的依賴替換配置似乎是更慣用的方法。與往常一樣,完整的代碼和 Gradle 配置可在 GitHub 上獲得。