如何排除依赖项被 Spring Boot 的依赖项管理插件固定?
How do I exclude a dependency from being pinned by Spring Boot's dependency management plugin?
我正在使用 Spring Boot 和 Gradle 依赖管理插件:
plugins {
id 'org.springframework.boot' version '2.5.6'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
发生的情况是,这使用了 Spring Boot dependency BOM to resolve any dependency versions. I'm running into issues because some libraries that I'm using require different versions of these dependencies and when the plugin overrides these then I run into compatibility issues. For example, I'm using Debezium 1.7.1 which requires Kafka 2.8.1,但 Spring 仍然坚持将其降级到 2.7.1,或者上面 BOM 文件中固定的版本。
据我所知,这里有两个选择:
- 以某种方式排除 Spring 依赖管理插件尝试解析此依赖项 (Kafka) 的版本,让 Debezium 来做
- 为依赖版本手动覆盖 Spring 属性:
ext['kafka.version'] = '2.8.1'
后者有效,但需要我将 Kafka 与 Debezium 分开版本,这很容易崩溃。
我如何实现前者,或者是否有更清洁的替代方案?谢谢!
更简洁、更高效的方法是使用 Gradle's platform support。因此,drop/remove Spring 依赖管理插件完全:
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 的 standard dependency resolution 将发挥作用。默认情况下,两个依赖项的较高版本将获胜。 Spring Boot 2.5.6 Kafka 2.7.1 而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 依赖管理插件是贪婪的,这意味着它在不需要的时候“触及”一切。我建议观看 this Jenn Strater 和 Andy Wilkinson 关于差异的演讲。
我正在使用 Spring Boot 和 Gradle 依赖管理插件:
plugins {
id 'org.springframework.boot' version '2.5.6'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
发生的情况是,这使用了 Spring Boot dependency BOM to resolve any dependency versions. I'm running into issues because some libraries that I'm using require different versions of these dependencies and when the plugin overrides these then I run into compatibility issues. For example, I'm using Debezium 1.7.1 which requires Kafka 2.8.1,但 Spring 仍然坚持将其降级到 2.7.1,或者上面 BOM 文件中固定的版本。
据我所知,这里有两个选择:
- 以某种方式排除 Spring 依赖管理插件尝试解析此依赖项 (Kafka) 的版本,让 Debezium 来做
- 为依赖版本手动覆盖 Spring 属性:
ext['kafka.version'] = '2.8.1'
后者有效,但需要我将 Kafka 与 Debezium 分开版本,这很容易崩溃。
我如何实现前者,或者是否有更清洁的替代方案?谢谢!
更简洁、更高效的方法是使用 Gradle's platform support。因此,drop/remove Spring 依赖管理插件完全:
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 的 standard dependency resolution 将发挥作用。默认情况下,两个依赖项的较高版本将获胜。 Spring Boot 2.5.6 Kafka 2.7.1 而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 依赖管理插件是贪婪的,这意味着它在不需要的时候“触及”一切。我建议观看 this Jenn Strater 和 Andy Wilkinson 关于差异的演讲。