【问题标题】:Transitive dependency version is downgraded by Spring boot gradle plugin传递依赖版本被 Spring boot gradle 插件降级
【发布时间】:2021-10-08 15:03:12
【问题描述】:

我有一个 gradle 项目,它在其他项目中用作库。库项目指定了一个依赖:

        compile('org.apache.kafka:kafka-clients') {
            version {
                strictly '2.6.1'
            }
        }

但是,当构建另一个使用此库的项目时,版本会降级为“2.3.1”。我发现它发生是因为该项目还使用 Spring Boot gradle 插件,而 Spring Boot 取决于该版本。 如何确保使用自定义库中的版本?我知道如何直接在子项目中执行此操作,但问题是有很多项目使用该库,我想避免在每个项目中重复依赖版本。有没有办法在一个地方(自定义库或自定义 gradle 插件)做到这一点?

我已经尝试使用strictly 关键字指定依赖版本,并尝试将kafka.version 放入gradle.properties。但是,只有直接在子项目中完成,但如果我在库项目中完成,这一切都有效。

【问题讨论】:

    标签: gradle spring-boot-gradle-plugin gradle-dependencies


    【解决方案1】:

    您可以使用 ExtraPropertiesExtension ext 覆盖默认行为:https://docs.spring.io/spring-boot/docs/2.5.3/gradle-plugin/reference/htmlsingle/#managing-dependencies.dependency-management-plugin.customizing

    示例

    假设我有一个这样的多模块项目:

    root
    ├── aa
    │   └── build.gradle
    ├── bb
    │   └── build.gradle
    └── settings.gradle
    

    项目aa包含Kafka依赖:

    // aa/build.gradle
    
    plugins {
        id "java"
        id "java-library"
    }
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        api "org.apache.kafka:kafka-clients:2.6.1"
    }
    

    项目bb有Spring Boot,依赖aa

    // bb/build.gradle
    
    plugins {
        id "java"
        id("org.springframework.boot") version "2.5.2"
        id("io.spring.dependency-management") version "1.0.11.RELEASE"
    }
    
    repositories {
        mavenCentral()
    }
    
    ext["kafka.version"] = '2.6.1'
    
    dependencies {
        implementation project(":aa")
    
        implementation("org.springframework.boot:spring-boot-starter-web")
        testImplementation("org.springframework.boot:spring-boot-starter-test")
    }
    

    没有ext的依赖树

    productionRuntimeClasspath
    +--- project :aa
    |    \--- org.apache.kafka:kafka-clients:2.6.1 -> 2.7.1
    |         +--- com.github.luben:zstd-jni:1.4.5-6
    |         +--- org.lz4:lz4-java:1.7.1
    |         +--- org.xerial.snappy:snappy-java:1.1.7.7
    |         \--- org.slf4j:slf4j-api:1.7.30 -> 1.7.31
    \--- org.springframework.boot:spring-boot-starter-web -> 2.5.2
         +--- org.springframework.boot:spring-boot-starter:2.5.2
         |    +--- org.springframework.boot:spring-boot:2.5.2
         .
         .
    

    ext 的依赖关系树

    productionRuntimeClasspath
    +--- project :aa
    |    \--- org.apache.kafka:kafka-clients:2.6.1
    |         +--- com.github.luben:zstd-jni:1.4.4-7
    |         +--- org.lz4:lz4-java:1.7.1
    |         +--- org.xerial.snappy:snappy-java:1.1.7.3
    |         \--- org.slf4j:slf4j-api:1.7.30 -> 1.7.31
    \--- org.springframework.boot:spring-boot-starter-web -> 2.5.2
         +--- org.springframework.boot:spring-boot-starter:2.5.2
         |    +--- org.springframework.boot:spring-boot:2.5.2
         .
         .
    

    如果您想将此应用于所有子项目,您可以在buildSrc 的插件中设置ext 或在根项目的build.gradle 中设置subprojects 块。

    【讨论】:

    • 是的,但我没有多模型项目。我有多个单独的项目,它们只使用相同的共享自定义库。我还有一个用于所有这些项目的自定义 gradle 插件。所以我想知道是否可以在插件或库中定义我想在每个项目中使用的 kafka 版本。
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2016-11-09
    • 1970-01-01
    • 2021-11-17
    • 2016-11-30
    • 2017-07-05
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多