如何排除依赖项被 Spring Boot 的依赖项管理插件固定?
Posted
技术标签:
【中文标题】如何排除依赖项被 Spring Boot 的依赖项管理插件固定?【英文标题】:How do I exclude a dependency from being pinned by Spring Boot's dependency management plugin? 【发布时间】:2021-12-29 19:50:53 【问题描述】:我正在使用 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 来解析任何依赖版本。我遇到了问题,因为我使用的某些库需要这些依赖项的不同版本,当插件覆盖这些依赖项时,我会遇到兼容性问题。例如,我正在使用 requires 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 分开版本,这很容易崩溃。
如何实现前者,或者有更清洁的替代方案吗?谢谢!
【问题讨论】:
【参考方案1】:更清洁和更有效的方法是使用Gradle's platform support。因此,完全删除/删除 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 Dependency Management 插件是贪婪的,这意味着它在不需要时会“触及”所有内容。我建议观看 Jenn Strater 和 Andy Wilkinson 的 this 演示,了解这些差异。
【讨论】:
以上是关于如何排除依赖项被 Spring Boot 的依赖项管理插件固定?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 spring-boot-starter-parent 中排除特定依赖项
从 Gradle 中的 Spring Boot 中排除 Tomcat 依赖项
Spring Boot 应用程序“bean 类的 bean 名称与现有冲突” - 如何从 3rd 方库/依赖项中排除包/类?