Gradle:如何覆盖子项目中的变量?

Gradle:如何覆盖子项目中的变量?,gradle,Gradle,我定义使用一个字符串,该字符串在根项目的build.gradle中包含一个变量,我希望在不同子项目的build.gradle中以不同的方式定义该变量的值 Root build.gradle: 子项目的build.gradle: POM属性总是使用值xxx生成,而不会使用值yyy生成。如何执行此操作?默认情况下,根项目将在其子项目之前进行评估。因此,根项目中的子项目{…}块将在子build.gradle文件求值之前求值。因此,在计算子项目{…}块时,该属性没有重写 您可以在根项目中调用evalua

我定义使用一个字符串,该字符串在根项目的build.gradle中包含一个变量,我希望在不同子项目的build.gradle中以不同的方式定义该变量的值

Root build.gradle:

子项目的build.gradle:


POM属性总是使用值xxx生成,而不会使用值yyy生成。如何执行此操作?

默认情况下,根项目将在其子项目之前进行评估。因此,根项目中的子项目{…}块将在子build.gradle文件求值之前求值。因此,在计算子项目{…}块时,该属性没有重写

您可以在根项目中调用evaluationDependsOnChildren来翻转排序,但我不建议这样做,因为这可能会导致其他问题

也许你可以用一个闭包来推迟对房产的评估

另一个选项是在根build.gradle而不是子项目build.gradle中声明属性

例如:

或者另一种选择是使用afterEvaluate{…}闭包,我真的很讨厌这种方法,但有时这是唯一的方法

subprojects {
   afterEvaluate {...} 
} 

是否在第一个文件中使用子项目{…}?是。编辑了这篇文章。我尝试了闭包,但失败了:相同的结果。那很可能是因为我做错了。但是在根项目中定义它们是可行的!我不是那种结构的狂热粉丝,但有东西比没有好!正如我所说,总有后置评估{…}。这将允许您将配置保存在child build.gradle中
ext {
    diet4jActivationClass = 'yyy'
}
project(':xxx') {
   ext {
       diet4jActivationClass = 'xxx'
   }
}
project(':yyy') {
   ext {
       diet4jActivationClass = 'yyy'
   }
} 
subprojects {...}
subprojects {
   afterEvaluate {...} 
}