Java Gradle-使用以闭包为参数的插件方法时出现语法错误

Java Gradle-使用以闭包为参数的插件方法时出现语法错误,java,gradle,groovy,build.gradle,Java,Gradle,Groovy,Build.gradle,下面是build.gradle中的两个任务hello和printProperties: task('hello', { description("Hey student! Run this one :D") group("Our demo") doLast({println("Hello World!")}) } ) plugins({ id('java') }) ext({

下面是
build.gradle
中的两个任务
hello
printProperties

task('hello', {
            description("Hey student! Run this one :D")
            group("Our demo")
            doLast({println("Hello World!")})
            }
     )

plugins({
    id('java')
})

ext({
    springVersion = "3.1.0.RELEASE"
    emailNotification = "build@master.org"
})

sourceSets.all({ ext.purpose = null })

sourceSets({
    main({
        purpose = "production"
    })
    test({
        purpose = "test"
    })
    plugin({
        purpose = "production"
    })
})

task('printProperties', {
    doLast({
        println(springVersion)
        println(emailNotification)
        sourceSets.matching({ it.purpose == "production" }.each({ println it.name }))
    })
})

这就产生了错误:

> startup failed:
  build file '/../../build.gradle': 8:
only buildscript {} and other plugins {} script blocks are allowed before plugins {} blocks, no other statements are allowed

为什么
插件({id('java')})
会给出groovy脚本语法错误

答案如下:

每当您编写build.gradle脚本并使用新插件时 脚本块,您需要将其作为文件中的第一个块。唯一的 此规则的例外情况是其他插件块或特殊插件 buildScript块,它始终必须先执行


在插件块之后定义任务?@tim_yates开发人员为什么使用声明性语法?它不可读…我无法理解带有声明性语法的一行groovy代码。真的很痛。你已经解决了上面的错误。我不明白你在说什么,我想他说的是,他发现删除了paren和逗号的gradle dsl很难阅读(与包含它们的问题相比)。IMHO这是你花在DSL上的时间的函数。当你刚开始的时候,你需要所有的逗号和括号。一旦你使用它几年了,我必须在心里解析的信息内容越不重要、越不重要越好。我也是一名clojure程序员。在clojure,每个人都开始憎恨帕伦一家。五年后,我没有听说有一个人不喜欢他们。就我的2c。@Matiasbjarand花时间使用DSL与远离遵循另一种语法的常规编程语言(C/Python/java/GoLang/TyoeScript)是一样的,这种语法看起来有点接近groovy的脚本语法。