【问题标题】:Library version in gradle downgradedgradle 中的库版本已降级
【发布时间】:2020-07-18 19:47:41
【问题描述】:

执行时(在 gradle 6.5 中)

./gradlew dependencyInsight --dependency groovy-testng --configuration testRuntimeClasspath

我可以找到groovy-testng 来自groovy-all 库,该库已添加到我们的build.gradle。我想更新groovy-testng的版本,所以我决定更新groovy-all,根据mvnrepository,它在3.0.4版本中包含groovy-testng,但groovy-testng的版本仍然是旧版本,而gradle没有' t 将其解析为最新版本:

org.codehaus.groovy:groovy-testng:2.5.12 (selected by rule)
   variant "runtime" [
      org.gradle.status              = release (not requested)
      org.gradle.usage               = java-runtime
      org.gradle.libraryelements     = jar
      org.gradle.category            = library

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
         org.gradle.jvm.version         = 11
   ]

org.codehaus.groovy:groovy-testng:3.0.4 -> 2.5.12
\--- org.codehaus.groovy:groovy-all:3.0.4
     \--- testRuntimeClasspath

我找到了selected by rule 行,但在我的项目中找不到任何ResolutionStrategy,所以我开始注释掉,看看是什么原因造成的。原来这是一个插件org.springframework.bootio.spring.dependency-management 一起导致这个版本被降级。为什么?为什么只有当它们都包括在内时?我假设这些插件定义了一些 ResolutionStrategy?找出ResolutionStrategy 来自哪里的最简单方法是什么?

【问题讨论】:

    标签: gradle


    【解决方案1】:

    Spring 依赖管理插件相当笨重。如果您使用--info-i 构建项目,您会看到一堆这样的日志:

    Applying dependency management to configuration 'bootArchives' in project 'demo'
    Applying dependency management to configuration 'archives' in project 'demo'
    Applying dependency management to configuration 'default' in project 'demo'
    Applying dependency management to configuration 'compile' in project 'demo'
    Applying dependency management to configuration 'implementation' in project 'demo'
    Applying dependency management to configuration 'runtime' in project 'demo'
    Applying dependency management to configuration 'compileOnly' in project 'demo'
    

    根据我的经验,依赖管理插件将获胜/强制自己获胜。

    我可以在您的 sn-p 中看到,您想要 Groovy 的 3.0.4,但 Gradle 解决了 2.5.12。如果您查看 Spring Boot Dependencies BOM,您将看到 2.5.12 是 Spring Boot 2.3.1 的当前版本:https://github.com/spring-projects/spring-boot/blob/2.3.x/spring-boot-project/spring-boot-dependencies/build.gradle#L365..L371

    Spring Boot Gradle 插件检测 Spring 依赖管理插件是否存在,如果存在,配置插件导入 Spring Boot 依赖 BOM:https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/DependencyManagementPluginAction.java

    通过查看 BOM:https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-dependencies/2.3.1.RELEASE/spring-boot-dependencies-2.3.1.RELEASE.pom

    您应该能够像这样覆盖 Groovy 版本:

    ext {
      set("groovy.version", "3.0.4")
    }
    

    Spring 依赖管理插件应该选择它并应用 3.0.4

    如果这不能解决您的问题,那么您需要了解其他插件或配置。

    我也建议看Managing Dependencies for Spring Projects with Gradle,了解Spring依赖管理插件和Gradle原生依赖管理的区别。

    【讨论】:

      猜你喜欢
      • 2021-07-15
      • 1970-01-01
      • 2021-05-19
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多