Groovy AST转换不会在Grails编译期间应用,只会在自动加载期间应用



我已经编写了一个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/javagrails-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。

相关内容

  • 没有找到相关文章

最新更新