当前位置: 首页 > 知识库问答 >
问题:

Groovy AST转换在Grails编译期间不应用,仅在自动重载期间应用

程沛
2023-03-14

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

注释和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。

共有3个答案

邢晗日
2023-03-14

此外,如果你想避免注释并将其应用到每一个可能的类中,你可以在这里查看我的答案!

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

段干玺
2023-03-14

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

如果您只有一些AST转换,那么这是目前最好的方法。用编译好的jar创建一个插件或单独的项目对我来说太麻烦了。

齐甫
2023-03-14

所有各种 src/groovysrc/java圣杯应用/* 文件都一次性编译在一起,因此 AST 转换在编译域类时对编译器不可用。但是,插件在应用程序之前的单独传递中编译,因此一种选择可能是创建一个非常简单的插件,只是为了包含注释和AST转换类,并在BuildConfig中将其声明为内联插件

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

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

 类似资料:
  • 我在我的反应项目中得到了这些警告:(文件夹中的包是最新的。) 如何解决这些警告? /src/index.css(./node_modules/css-loader/dist/cjs.js??ref--5-oneOf-4-1!./node_modules/postcss-loader/src??Postcss!./src/index.css)警告 (309:5)开始值有混合支持,考虑使用Flex启动

  • 从API中,我得到这样的消息:“2022-05-12T15:55:03.000000Z”我的问题是,我如何才能做到:12.05.2022,15:55 我的问题是,这里有什么简单的方法吗?否则我可以用字符串方法慢慢地和部分地转换它,但我想一定有更好、更合适的方法? 提前感谢您

  • 我有一个Spring Boot应用程序,它有一些外部依赖(例如,项目之外的文件,需要存在,以便应用程序正确启动)。 和一系列其他例外。有没有一种方法可以恰当地做到这一点?

  • 问题内容: 是否有一个内置的转换方法为在Python,例如获得在指定日期的午夜?相反的转换很容易:有一个方法。 我真的必须手动打电话吗? 问题答案: 您可以使用;现在,您创建一个初始化为午夜的对象。

  • 我有一张谷歌表,上面有日期时间数字,格式如下:42385.7441666700 我正在写一个脚本,我想以HH:MM的格式从这些数字中提取时间。上述数字应返回17:51。 我尝试了此代码,但不起作用:

  • 问题内容: 属性的允许在呈现相应视图之前执行一些作业。 如果我想在执行这些作业时显示微调框以增加用户体验怎么办? 确实,否则,用户会感觉到应用程序已被阻止,因为例如在大于600的毫秒内没有显示任何视图元素。 当然,由于该功能,因此可以 从当前视图中定义* 要显示的全局元素,以便显示微调器。 但是我不想只在中间放置一个糟糕的微调器来隐藏整个页面。 我希望Webapp的某些页面在显示加载方式方面有所不