我正在使用 Spring Boot 和 Gradle 依賴管理插件:
plugins {
id 'org.springframework.boot' version '2.5.6'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
發生的情況是,這使用Spring Boot 依賴項 BOM來決議任何依賴項版本。我遇到了問題,因為我使用的某些庫需要這些依賴項的不同版本,當插件覆寫這些依賴項時,我遇到了兼容性問題。例如,我正在使用需要 Kafka 2.8.1 的Debezium 1.7.1,但 Spring 仍然堅持將其降級到 2.7.1,或固定在上述 BOM 檔案中的版本。
據我所知,我在這里有兩個選擇:
- 以某種方式排除 Spring 依賴管理插件嘗試決議此依賴項 (Kafka) 的版本并讓 Debezium 去做
- 手動覆寫依賴版本的 Spring 屬性:
ext['kafka.version'] = '2.8.1'
后者有效,但需要我將 Kafka 與 Debezium 分開進行版本控制,這很容易崩潰。
我如何實作前者,或者是否有更清潔的替代方案?謝謝!
uj5u.com熱心網友回復:
一種更干凈、更有效的方法是使用Gradle 的平臺支持。因此,完全洗掉/洗掉 Spring Dependency Management 插件:
import org.springframework.boot.gradle.plugin.SpringBootPlugin;
dependencies {
implementation(platform(SpringBootPlugin.BOM_COORDINATES))
}
Debezium 還提供了一個 BOM,您也可以匯入它:
import org.springframework.boot.gradle.plugin.SpringBootPlugin;
dependencies {
implementation(platform(SpringBootPlugin.BOM_COORDINATES))
implementation(platform("io.debezium:debezium-bom:1.7.1.Final"))
}
有了這些更改,Gradle 的標準依賴項決議將發揮作用。默認情況下,兩個依賴項的更高版本將獲勝。Spring Boot 2.5.6 在 2.7.1 有 Kafka,而 Debezium 定義了更高的版本,所以自然是 Debezium 的版本會贏。
如果由于某種原因您需要控制特定的依賴版本,那么您可以執行以下操作:
import org.springframework.boot.gradle.plugin.SpringBootPlugin;
configurations.configureEach {
resolutionStrategy.eachDependency {
if (requested.group == "org.apache.kafka") {
useVersion("x.x.x")
because("We require this version for X reason")
}
}
}
dependencies {
implementation(platform(SpringBootPlugin.BOM_COORDINATES))
implementation(platform("io.debezium:debezium-bom:1.7.1.Final"))
}
以上更具有表現力和效率。我強調高效,因為 Spring Dependency Management 插件是貪婪的,這意味著它在不需要時“接觸”一切。我建議看這個演示由小唐STRATER和安迪·威爾金森上的差異。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/360872.html
上一篇:Spring無法識別css檔案
