6

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

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

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

注释:

@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。

4

3 回答 3

4

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

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

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

于 2013-01-10T23:34:21.063 回答
3

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

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

于 2013-09-22T21:09:28.143 回答
0

此外,如果您想避免注释并将其应用于每个班级,您可以 在此处查看我的答案!

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

于 2015-02-05T05:07:10.723 回答