为了以最简单的方式解释我的问题,我将首先向您展示一个可行的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而不是编译时:结果是相同的。)
答案 0 :(得分:1)
我在Gradle论坛上发布了同样的问题,根据Gradle开发人员的说法,Groovy的@Mixin
和Gradle自己的元编程工具之间存在不兼容性。他们建议使用Gradle的额外属性和/或扩展对象。