0

私の問題を最も簡単な方法で説明するために、最初に機能する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タスクと連携させるにはどうすればよいですか?(参考:継承とは関係がないようです。確認しましたが、簡単にするためにサンプルスクリプトに含めませんでした。コンパイル時ではなく、ランタイムミックスインを使用してテストしました。結果は次のとおりです。同じ)。

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 に答える