gradle - 在gradle中,子项目可以覆盖rootProject中定义的resolutionStrategy吗?

标签 gradle

在我的项目中,这是根项目部分:

configure(allprojects) {
  apply plugin: "java"
  apply plugin: "idea"
  apply plugin: "eclipse"
  apply from: "${gradleScriptDir}/ide.gradle"

  group = "org.springframework.data"

  configurations.all {

    // Hack to let Gradle pickup latest SNAPSHOTS
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'

    // Force all core Spring Framework libraries into the same version
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
      if (details.requested.group == 'org.springframework') {
          details.useVersion "$springVersion"
      }
    }
...

在一个特定的子项目中,我想更改应用的版本并使用另一个版本。我尝试将配置{},配置{}和简单的resolutionStrategy放入,但是它们都不起作用。这是否可行,或者是我需要将该子项目完全移至其他项目的信号?

更新:

我尝试了这个:
project("spring-data-rest-boot") {
    apply plugin: "spring-boot"
    description = "Spring Data REST example using Spring Boot"

    configurations {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            if (details.requested.group == 'org.springframework') {
                details.useVersion "4.0.0.RELEASE"
            }
        }
    }
...

并得到了这一点:在配置':spring-data-rest-boot:resolutionStrategy'上找不到参数[build_p7c7h594c24dhb3ll7q8nj34m $ _run_closure4_closure19_closure21 @ 3eff4d1f]的方法eachDependency()。

这个:
project("spring-data-rest-boot") {
    apply plugin: "spring-boot"
    description = "Spring Data REST example using Spring Boot"

    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.group == 'org.springframework') {
            details.useVersion "4.0.0.RELEASE"
        }
    }
...

产生了这样的结果:在项目':spring-data-rest-boot'上找不到属性'resolutionStrategy'。

最佳答案

依赖关系规则是按配置的,而配置是按项目的。为了使新规则生效,您必须使用与allprojects相同的正确语法:

project("spring-data-rest-boot") {
    ...
    configurations.all { 
        resolutionStrategy.eachDependency { ... } 
    }
}

但是,如果为第一个依赖项规则保留allprojects,最终将为spring-date-rest-boot使用两个竞争规则,这引发了一个问题:哪个将获胜。

如果只有一个项目需要特殊处理,则还可以在allprojects规则中使用条件:
allprojects {
    ...
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.group == 'org.springframework') {
            if (project.name == "spring-data-rest-boot") {
                details.useVersion("4.0.0.RELEASE")
            } else {
               details.useVersion(springVersion)
            }
        }
    }
}

另一个可行的解决方案是简单地更改springVersion的值:
project("spring-data-rest-boot") {
    ...
    springVersion = "4.0.0.RELEASE"
}

还有更多的方法可以解决这个问题,但我希望您现在就明白了。

关于gradle - 在gradle中,子项目可以覆盖rootProject中定义的resolutionStrategy吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20977138/

相关文章:

android lint - 使用 apache odata-client-android 时出现 InvalidPackage 错误

java - 如何在不构建项目的情况下更新 gradle 依赖项

gradle - 我如何在 sbt 中使用变量

css - Assets 管道最小化为CSS header 添加问号

maven - 如何在两个 nexus 存储库 (jenkins) 之间移动 Artifact ?

java - Android:加载库并仅将其用于开发分支而不是发布

java - 无法使用Glassfish部署War文件

android - 使用Gradle 3.1.0运行时Jacoco崩溃

ssl - Gradle 任务 - Https 请求 - 附加客户端证书

android - 如何管理和引用特定的依赖库版本?