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

时间:2014-01-07 16:43:57

标签: 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"
      }
    }
...

在一个特定的子项目中,我想更改应用的版本并使用另一个版本。我已经尝试过配置{},配置{}和简单的resolveStrategy,但它们都不起作用。这是可能的,还是我需要将这个子项目完全移到另一个项目的标志?

更新:

我试过了:

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"
            }
        }
    }
...

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

此:

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'。

1 个答案:

答案 0 :(得分:0)

依赖性规则是按配置进行的,配置是按项目进行的。要使新规则有效,您必须使用在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"
}

还有更多方法可以解决这个问题,但我希望你现在能够明白这个想法。