Groovy mixin与Gradle DefaultTask相结合会导致运行时错误

时间:2012-05-25 12:33:40

标签: groovy gradle mixins

为了以最简单的方式解释我的问题,我将首先向您展示一个可行的Groovy脚本,然后添加一些打破它的Gradle酱。

工作脚本:

class MyMixin {
    String myname = 'max'
}

@Mixin(MyMixin)
class MyClass {}

MyClass c = new MyClass()
println 'hello ' + c.myname

按预期打印出“hello max”。现在让我们用Gradle任务类替换MyClass。为此,我们扩展DefaultTask并使用@TaskAction注释。

@Mixin(MyMixin)
class MyTask extends DefaultTask {

    @TaskAction
    void sayHello() {
        println 'hello ' + myname
    }
}

如果我们现在安装此Gradle任务并执行它,我们会收到以下运行时错误:

Execution failed for task ':myproject:mytask'.
> MyTask.getMyname()Ljava/lang/String;

有趣的是,只有返回某些东西的方法才会发生这种情况。 void方法执行得很好。

所以问题很简单:如何让我的mixin与我的Gradle任务合作?(仅供参考:它似乎与继承没有关系;我检查过,但没有'将它包含在示例脚本中以保持简单。我还测试了运行时mixin而不是编译时:结果是相同的。)

1 个答案:

答案 0 :(得分:1)

我在Gradle论坛上发布了同样的问题,根据Gradle开发人员的说法,Groovy的@Mixin和Gradle自己的元编程工具之间存在不兼容性。他们建议使用Gradle的额外属性和/或扩展对象。

供参考:http://forums.gradle.org/gradle/topics/groovy_mixin_combined_with_gradle_defaulttask_results_in_runtime_error