在gradle中,子项目能否覆盖根项目中定义的解决策略?

在gradle中,子项目能否覆盖根项目中定义的解决策略?,gradle,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 pi

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

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"
      }
    }
...
在一个特定的子项目中,我想更改应用的版本并使用另一个版本。我尝试过将配置{}、配置{}和简单的解析策略放在一起,但它们都不起作用。这是可能的,还是我需要将这个子项目完全转移到另一个项目

更新:

我试过这个:

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_p7c7h594dc24dhb3ll7q8nj34m$\u run\u closure4\u closure19]的方法eachDependency()_closure21@3eff4d1f]配置:spring数据rest启动:resolutionStrategy

这:


生成了以下内容:在项目上找不到属性“resolutionStrategy”:spring data rest启动。

依赖项规则是每个配置的,配置是每个项目的。要使新规则生效,您必须使用与在
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"
}

有更多的方法来解决这个问题,但我希望你现在就知道了。

你说的“搬到另一个项目”是什么意思?子项目是不同的项目(在同一版本中)。你是说“不同的构建脚本”吗?还有,你到底尝试了什么,以及它到底是如何不起作用的?与其让一个子文件夹包含我的新演示应用程序,不如在整个项目结构之外的另一个文件夹中创建一个完全独立的应用程序。谢谢。这给了我几个选择。
project("spring-data-rest-boot") {
    ...
    springVersion = "4.0.0.RELEASE"
}