Gradle,在 build.gradle 脚本中创建对象

5
在我的Gradle插件中,我使用了其他的build.gradle脚本,它看起来像这样:

build.gradle:

sciptInstance {
    name {
        arrayWithObjects = [
            {
                var1 = "val1"
                var2 = "val2"
            {
        ]
    }
}

在Gradle插件中,我声明了一个容器来保存ScriptClass类的实例。这个类有一个字段arrayWithObjectsarrayWithObjects元素的类声明如下:
MyClass {
    def var1
    deg var2
}

在我的SciptClass中:
ScriptClass {
    // other fields
    MyClass[] arrayWithObjects

    // constructor and so on..
}

在尝试构建脚本时,我收到了一个类型转换异常,说我不能将闭包强制转换为对象。我尝试在build.gradle中使用其他括号声明arrayWithObjects等方法,但是没有任何实际效果。我也不知道该去哪里寻找答案。也许你们中的一些人之前遇到过这个问题? 提前感谢您。
编辑: 要重现此问题: 插件:
apply plugin: MyPlugin

apply from: 'example.gradle'

class MyPlugin implements Plugin<Project> {
    void apply(Project project) {
        def examples = project.container(ScriptClass)
        project.extensions.examples = examples
    }
}

class ScriptClass {
    String name
    MyClass[] arrayWithObjects

    ScriptClass(String name) {
        this.name = name
    }
}

class MyClass {
    def var1
    def var2
}

example.gradle:

examples {
    example {
        arrayWithObjects = [
                {
                    var1 = "val1"
                    var2 = "val2"
                }
        ]
    }
}

在主要的build.gradle文件中应用此插件并调用任何任务。

请提供一个示例项目,以说明问题。 - Opal
说实话,我不太清楚你需要我提供什么。问题出现在创建ScriptClass实例时,因为它试图创建对象数组,但对象可能没有正确声明。 - Morales
整个 build.gradle 文件展示了问题,我不知道如何重现你的问题以便解决它。 - Opal
@Opal请现在查看。 - Morales
1个回答

4

这里可以找到解决问题的演示。基本上,您需要使用Map而不是Closure

examples {
    example {
        arrayWithObjects = [
                [var1: 'varvar1', var2: 'varvar2']
        ]
    }
}

现在运行得非常好。正如我所认为的那样,这是一个语法问题。非常感谢您的支持! - Morales

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接