0

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

工作脚本:

class MyMixin {
    String myname = 'max'
}

@Mixin(MyMixin)
class MyClass {}

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

这会按预期打印出“hello max”。现在让我们MyClass用 Gradle 任务类替换它。为此,我们扩展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 任务合作?(仅供参考:它似乎与继承无关;我检查了这一点,但没有将其包含在示例脚本中以保持简单。我还使用运行时混合而不是编译时进行了测试:结果是相同)。

4

1 回答 1

1

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

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

于 2012-05-25T14:32:10.887 回答