2013-01-10 11 views
6

के दौरान मैंने एक ग्रोवी एएसटी परिवर्तन लिखा है जो केवल मेरे लिए चलता है जब Grails कक्षा को स्वत: पुनः लोड करता है, इसे लागू किया जाना है। यदि मैं प्रोजेक्ट को साफ़ करता हूं और रन-ऐप का उपयोग करके एप्लिकेशन शुरू करता हूं, तो एएसटी रूपांतरण नहीं चलता है। कक्षा को छूना ताकि ग्राइल्स ऑटो-रीलोड्स के परिणामस्वरूप चल रहे परिवर्तन में परिणाम हो।ग्रोवी एएसटी परिवर्तन ग्रेल्स संकलन के दौरान लागू नहीं होता है, केवल ऑटो-रीलोडिंग

एनोटेशन और एएसटीट्रांसफॉर्मेशन कार्यान्वयन मेरे Grails अनुप्रयोग में src/groovy निर्देशिका में स्थित groovy कक्षाएं हैं। डोमेन निर्देशिका में ग्रोवी में लिखे गए डोमेन वर्गों पर एनोटेशन का उपयोग किया जाता है।

क्या यह संभव है कि यह ग्रोवी फाइलों को संकलित या ऑर्डर क्लासलोडर द्वारा लोड किए जाने के क्रम के कारण हो? यदि हां, तो मैं कैसे सुनिश्चित करूं कि मेरा वर्ग ट्रांसफोर्मेशन डोमेन कक्षाओं से पहले संकलित/लोड हो गया है?

एनोटेशन:

@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

एएसटी ट्रांसफॉर्मेशन को आपके प्रोजेक्ट कोड से पहले संकलित करने की आवश्यकता है। ऐसा करने का सबसे आसान तरीका एक स्क्रिप्ट के साथ grails संकलन घटना में हुक करना है। Src/ast फ़ोल्डर में स्रोत को precompile करने के लिए नए चींटी कार्य के साथ एक स्क्रिप्ट बनाने के लिए इस ब्लॉग पोस्ट को देखें। http://reinhard-seiler.blogspot.com.au/2011/09/grails-with-ats-transformation-tutorial.html

यदि आपके पास केवल कुछ एएसटी ट्रांसफॉर्मेशन हैं तो यह अब तक का सबसे अच्छा तरीका है। संकलित जार के साथ एक प्लगइन या अलग परियोजना बनाना मेरी आवश्यकताओं के लिए बहुत अधिक काम है।

4

सभी विभिन्न src/groovy, src/java और grails-app/* फ़ाइलें एक ही बार में एक साथ संकलित हैं, इसलिए एएसटी को बदलने बिंदु है जहां वह आपके डोमेन कक्षाओं संकलित पर संकलक करने के लिए उपलब्ध नहीं है। हालांकि प्लगइन्स एक अलग पास में संकलित करने के एप्लिकेशन तो एक ही विकल्प सिर्फ एक बहुत ही सरल प्लगइन बनाने के लिए एनोटेशन को रोकने के लिए हो सकता है और AST में BuildConfig

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

बदलना एक इनलाइन प्लगइन के रूप में वर्ग को बदलने और घोषणा करते हैं कि इससे पहले कि तब प्लगइन संकलन पास में बनाया जाएगा और जब आपके डोमेन बनाने की बात आती है तो संकलक क्लासपाथ पर होगा।

0

यदि आप एनोटेशन से बचना चाहते हैं और इसे हर कक्षा में लागू करना चाहते हैं, तो आप मेरा उत्तर here देख सकते हैं!

उत्तर वैश्विक एएसटीट्रांसफॉर्म को लागू करने का तरीका बताता है। आप ट्रांसफॉर्मर के बाद संकलित सभी कक्षाओं में परिवर्तन लागू कर सकते हैं।

संबंधित मुद्दे