我已经编写了一个Groovy AST Transformation,它只在Grails自动重新加载要应用的类时为我运行。如果我清理项目并使用run-app启动应用程序,则AST转换不会运行。触摸类以使grails自动重新加载,会导致转换运行。
注释和ASTTransformation实现是位于Grails应用程序的src/groovy目录中的groovy类。该注释用于域类,在域目录下用groovy编写。
这是否可能是由groovy文件编译的顺序或当它们被类加载器加载时引起的?如果是这样,我如何确保在域类之前编译/加载最后的转换?
注释:
@Target([ElementType.TYPE])
@Retention(RetentionPolicy.RUNTIME)
@GroovyASTTransformationClass(["com.abc.annotation.SecuredObjectASTTransformation"])
public @interface SecuredObject {
}
asttransformation实现:
@GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
class SecuredObjectASTTransformation implements ASTTransformation {
@Override
public void visit(ASTNode[] nodes, SourceUnit sourceUnit) {
// add some new properties...
}
}
所有不同的src/groovy
, src/java
和grails-app/*
文件一次编译在一起,所以AST转换在编译器编译你的域类时不可用。然而,在应用程序之前,插件在一个单独的通道中编译,所以一个选项可能是创建一个非常简单的插件,只是包含注释和AST转换类,并声明为BuildConfig
中的内联插件
grails.plugin.location.'secured-objects' = '../secured-objects'
转换将在插件编译过程中构建,并且在构建域时将在编译器类路径中。
AST转换需要在项目代码之前编译。最简单的方法是用脚本钩入grails编译事件。查看这篇博客文章,了解如何使用新的ant任务创建脚本来预编译src/ast文件夹中的源代码。http://reinhard-seiler.blogspot.com.au/2011/09/grails-with-ats-transformation-tutorial.html
如果您只有几个AST转换,那么这是迄今为止最好的方法。创建一个插件或单独的项目与编译jar是太多的工作,为我的需要。
如果您想避免使用注释并将其应用于所有可能的类,您可以在这里查看我的答案!
答案描述了如何应用全局ASTTransforms。您可以在Transformer之后编译的所有类中应用transform。