如何排除依赖项被 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 方库/依赖项中排除包/类?

摇篮 | Spring boot 依赖不排除

Gradle 依赖项排除后,依赖项仍在类路径上

如何排除从项目依赖项中扫描的 Spring bean?