簡體   English   中英

只有在自動重新加載期間,才會在Grails編譯期間應用Groovy AST Transformation

[英]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/groovysrc/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創建插件或單獨的項目對我的需求來說太多了。

此外,如果您想避免使用Annotations並將其應用於每個可能的課程,您可以在這里查看我的答案!

答案描述了如何應用Global ASTTransforms。 您可以在Transformer之后編譯的所有類中應用transform。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM