只有在自动重新加载期间,才会在Grails编译期间应用Groovy AST Transformation

Dón*_*yle 6 grails groovy abstract-syntax-tree grails-2.1

我编写了一个Groovy AST Transformation,当Grails自动重新加载要应用的类时,它只为我运行.如果我清理项目并使用run-app启动应用程序,则AST转换不会运行.触摸该类以便grails自动重新加载会导致转换运行.

注释和ASTTransformation实现是位于Grails应用程序的src/groovy目录中的groovy类.注释用于域类,在域目录中以groovy编写.

是否可能这是由groovy文件编译的顺序或类加载器加载它们的顺序引起的?如果是这样,我如何确保在域类之前编译/加载我的ast transforamtion?

注释:

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

ASTTransforamtion实现:

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

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

Grails版本是2.1.0.

小智 3

AST 转换需要在项目代码之前编译。最简单的方法是使用脚本挂钩 grails 编译事件。查看这篇博客文章,了解如何使用新的 ant 任务创建脚本来预编译 src/ast 文件夹中的源代码。 http://reinhard-seiler.blogspot.com.au/2011/09/grails-with-ats-transformation-tutorial.html

如果您只有几个 AST 转换,那么这是迄今为止最好的方法。使用已编译的 jar 创建插件或单独的项目对于我的需求来说工作量太大。