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

时间:2013-01-10 21:35:24

标签: 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 {
}

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。

3 个答案:

答案 0 :(得分:4)

所有各种src/groovysrc/javagrails-app/*文件一次编译在一起,因此编译器编译域类时编译器无法使用AST转换。然而,插件在应用程序之前的单独传递中编译,因此一个选项可能是创建一个非常简单的插件,只是为了包含注释和AST转换类,并将其声明为BuildConfig中的内联插件

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

然后,转换将在插件编译过程中构建,并且在构建域时将位于编译器类路径上。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

此外,如果您想避免使用Annotations并将其应用于每个可能的课程,您可以查看我的答案here

答案描述了如何应用Global ASTTransforms。您可以在Transformer之后编译的所有类中应用transform。