为什么这个字符串替换/连接在Gradle中不起作用?

为什么这个字符串替换/连接在Gradle中不起作用?,gradle,Gradle,在build.gradle文件的这个片段中,对${appengineVersion}的第一个引用(第11行)会导致错误。但是第二个参考(第27行)工作正常。为什么呢 为了让它工作,我必须在第11行显式地包含版本号…这意味着我下次会忘记更新它。如何解决这个问题 apply插件:“war” 应用插件:“appengine” def appengineVersion=“1.9.48” 构建脚本{ 存储库{ mavenCentral() } 依赖关系{ classpath“com.google.appe

build.gradle
文件的这个片段中,对
${appengineVersion}
的第一个引用(第11行)会导致错误。但是第二个参考(第27行)工作正常。为什么呢

为了让它工作,我必须在第11行显式地包含版本号…这意味着我下次会忘记更新它。如何解决这个问题

apply插件:“war”
应用插件:“appengine”
def appengineVersion=“1.9.48”
构建脚本{
存储库{
mavenCentral()
}
依赖关系{
classpath“com.google.appengine:gradle-appengine插件:${appengineVersion}”
}
}
战争{
来自“src/main/webUI/app”
排除('src/main/webUI/app/node_模块')
}
存储库{
mavenLocal()
mavenCentral()
}
依赖关系{
appengineSdk“com.google.appengine:appengine java sdk:${appengineVersion}”
编译“javax.servlet:ServletAPI:2.5”
...

在项目生成文件的顶层声明变量并不会使它们对所有Gradle块可见。
buildscript{}
是特殊的,它会在脚本的任何其他部分之前进行计算。您可以将声明移到
buildscript
中,但它也应该使其他块可见:

buildscript {
    def appengineVersion = "1.9.48"
    ...
但你需要像这样使用

dependencies {
    appengineSdk "com.google.appengine:appengine-java-sdk:" + appengineVersion

标准gradle实践是在
ext
命名空间中声明用户定义的属性。请参阅

你应该做:

ext.appengineVersion = "1.9.48"

解决方案是Oleg和RaGe的答案的组合:

将appengineVersion的声明移动到buildscript块中,并在ext命名空间中定义它

buildscript {
    ext.appengineVersion = "1.9.48"
    repositories {
        mavenCentral()
}
dependencies {
    classpath "com.google.appengine:gradle-appengine-plugin:${appengineVersion}"
    }
}
这允许通过buildscript依赖项和项目依赖项解析it变量:

dependencies {
    appengineSdk "com.google.appengine:appengine-java-sdk:${appengineVersion}"

    compile "javax.servlet:servlet-api:2.5"
    compile "com.google.appengine:appengine-api-1.0-sdk:${appengineVersion}"

这两个答案都是解决方案的关键部分。但不幸的是,我不能接受两个答案,所以我自己回答(并对两个答案进行投票)。

具体错误是:“在org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler上找不到属性'appengineVersion'_Decorated@6f9c2c4"谢谢!那是解决方案的一半:)谢谢!那是解决方案的一半:)