2013-01-10 3 views
6

Grails가 적용될 클래스를 자동으로 다시로드 할 때만 실행되는 Groovy AST 변환을 작성했습니다. 프로젝트를 정리하고 run-app를 사용하여 응용 프로그램을 시작하면 AST 변환이 실행되지 않습니다. grails가 자동 재 로딩되도록 변형을 실행하도록 클래스를 만지십시오.Grails 컴파일 중에 Groovy AST 변환이 적용되지 않습니다. 자동 로딩 중에 만 적용됩니다.

주석 및 ASTTransformation 구현은 Grails 애플리케이션의 src/groovy 디렉토리에있는 그루비 클래스입니다. 주석은 도메인 클래스에서 사용되며 groovy로 도메인 디렉토리에 작성됩니다.

groovy 파일이 컴파일되거나 클래스 로더에 의해로드되는 순서가 원인 일 수 있습니까? 그렇다면 도메인 이전에 astransformation이 컴파일 /로드되었는지 어떻게 확인할 수 있습니까?

주석 :

@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이다.

답변

2

프로젝트 코드 전에 AST 변환을 컴파일해야합니다. 가장 간단한 방법은 스크립트를 사용하여 grails 컴파일 이벤트에 연결하는 것입니다. src/ast 폴더에 소스를 미리 컴파일하기위한 새로운 ant 태스크가있는 스크립트를 작성하는 방법은이 블로그 게시물을 참조하십시오. http://reinhard-seiler.blogspot.com.au/2011/09/grails-with-ats-transformation-tutorial.html

AST 변환이 거의없는 경우 가장 좋은 방법입니다. 컴파일 된 항아리로 플러그인 또는 별도의 프로젝트를 만드는 것은 내 필요에 너무 많은 작업입니다.

4

모든 다양한 src/groovy, src/javagrails-app/* 파일은 한 번에 함께 컴파일되므로 AST 변환은 도메인 클래스를 컴파일하는 시점에서 컴파일러에서 사용할 수 없습니다. 그러나 플러그인 앱을 그렇게 하나의 옵션은 주석을 포함하도록 그냥 아주 간단한 플러그인을 만들 수 있습니다와 AST는 BuildConfig

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

변환에 인라인 플러그인으로 그 클래스를 변환하고 선언하기 전에 별도의 패스에서 컴파일 얻을 그런 다음 플러그인 컴파일 패스에 빌드되고 도메인을 빌드 할 때 컴파일러 클래스 경로에있게됩니다.

0

또한 주석을 피하고 가능한 모든 수업에 적용하려면 체크 아웃 할 수 있습니다. 내 대답 here!

대답은 글로벌 ASTTransform을 적용하는 방법을 설명합니다. Transformer 후에 컴파일 된 모든 클래스에서 transform을 적용 할 수 있습니다.