6

適用されるクラスをGrailsが自動リロードした場合にのみ実行されるGroovyASTトランスフォーメーションを作成しました。プロジェクトをクリーンアップし、run-appを使用してアプリケーションを起動すると、AST変換が実行されません。grailsが自動リロードするようにクラスに触れると、変換が実行されます。

アノテーションとASTTransformationの実装は、Grailsアプリケーションのsrc/groovyディレクトリにあるgroovyクラスです。アノテーションは、ドメインディレクトリのgroovyで記述されたドメインクラスで使用されます。

これは、Groovyファイルがコンパイルされる順序、またはクラスローダーによってロードされるときに発生する可能性がありますか?もしそうなら、どうすれば私のastトランスフォーメーションがドメインクラスの前にコンパイル/ロードされることを確認できますか?

注釈:

@Target([ElementType.TYPE])
@Retention(RetentionPolicy.RUNTIME)
@GroovyASTTransformationClass(["com.abc.annotation.SecuredObjectASTTransformation"])
public @interface SecuredObject {
}

ASTTransforamtionの実装:

@GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
class SecuredObjectASTTransformation implements ASTTransformation {

    @Override
    public void visit(ASTNode[] nodes, SourceUnit sourceUnit) {
        // add some new properties...
    }
}

Grailsのバージョンは2.1.0です。

4

3 に答える 3

4

さまざまなファイルとファイルはすべてsrc/groovysrc/javagrails-app/*にコンパイルされるため、ドメインクラスをコンパイルする時点でコンパイラはAST変換を使用できません。ただし、プラグインはアプリの前に別のパスでコンパイルされるため、1つのオプションは、アノテーションとAST変換クラスを含む非常に単純なプラグインを作成し、それをインラインプラグインとして宣言することです。BuildConfig

grails.plugin.location.'secured-objects' = '../secured-objects'

トランスフォームはプラグインのコンパイルパスに組み込まれ、ドメインの構築に関してはコンパイラのクラスパスに含まれます。

于 2013-01-10T23:34:21.063 に答える
3

AST 変換は、プロジェクト コードの前にコンパイルする必要があります。これを行う最も簡単な方法は、スクリプトを使用して grails コンパイル イベントにフックすることです。src/ast フォルダー内のソースをプリコンパイルする新しい Ant タスクを使用してスクリプトを作成する方法については、このブログ投稿を確認してください。 http://reinhard-seiler.blogspot.com.au/2011/09/grails-with-ats-transformation-tutorial.html

AST 変換が数個しかない場合は、これが断然最良の方法です。コンパイル済みの jar を使用してプラグインまたは別のプロジェクトを作成するのは、私のニーズにはあまりにも手間がかかります。

于 2013-09-22T21:09:28.143 に答える