[英]Groovy AST Transformation does not get applied during Grails Compile, only during Auto-Reloading
我編寫了一個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。
所有各種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創建插件或單獨的項目對我的需求來說太多了。
此外,如果您想避免使用Annotations並將其應用於每個可能的課程,您可以在這里查看我的答案!
答案描述了如何應用Global ASTTransforms。 您可以在Transformer之后編譯的所有類中應用transform。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.