【问题标题】:How do I exclude a dependency from being pinned by Spring Boot's dependency management plugin?如何排除依赖项被 Spring Boot 的依赖项管理插件固定?
【发布时间】: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 文件中的版本。

据我所知,这里有两个选择:

  1. 以某种方式排除 Spring 依赖项管理插件尝试解析此依赖项 (Kafka) 的版本并让 Debezium 完成
  2. 手动覆盖依赖版本的 Spring 属性:
ext['kafka.version'] = '2.8.1'

后者有效,但需要我将 Kafka 与 Debezium 分开版本,这很容易崩溃。

如何实现前者,或者有更清洁的替代方案吗?谢谢!

【问题讨论】:

    标签: spring spring-boot maven gradle dependency-management


    【解决方案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 演示,了解这些差异。

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2013-04-22
      • 2016-08-19
      • 2022-12-23
      • 2019-01-30
      相关资源
      最近更新 更多