我编写了一个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。
答案 0 :(得分:4)
所有各种src/groovy
,src/java
和grails-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。