私の問題を最も簡単な方法で説明するために、最初に機能するGroovyスクリプトを示し、次にそれを壊すGradleソースを追加します。
作業スクリプト:
class MyMixin {
String myname = 'max'
}
@Mixin(MyMixin)
class MyClass {}
MyClass c = new MyClass()
println 'hello ' + c.myname
これにより、期待どおりに「hellomax」が出力されます。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
メソッドは問題なく実行されます。
したがって、質問は単純です。ミックスインをGradleタスクと連携させるにはどうすればよいですか?(参考:継承とは関係がないようです。確認しましたが、簡単にするためにサンプルスクリプトに含めませんでした。コンパイル時ではなく、ランタイムミックスインを使用してテストしました。結果は次のとおりです。同じ)。