2012-07-23 7 views
5

मैं ग्रूवी को बड़े जावा एप्लिकेशन में एम्बेड करने की कोशिश कर रहा हूं।ग्रोवीशेल: एम्बेडेड निष्पादन

जावा एप्लिकेशन को स्टार्टअप पर कुछ उपयोगिता ग्रोवी स्क्रिप्ट लोड करना चाहिए।

एप्लिकेशन को अन्य स्क्रिप्ट कई बार चलाना चाहिए। जीयूआई में कुछ कोड दर्ज करने और इसे उपयोगकर्ता अनुरोध पर निष्पादित करने की आवश्यकता भी है।

मैं इस तरह स्टार्टअप स्क्रिप्ट लोड कर रहा हूँ:

GroovyShell gShell = new GroovyShell(); 
gShell.evaluate(new FileReader("scripts/autoload.groovy")); 

मान लीजिए मेरी autoload.groovy शामिल हैं:

def prnt(m) { 
    println("From Groovy: " + m); 
} 

यह ठीक काम करता है

समस्या का सामना करना पड़ रहा हूँ

यह है । लेकिन जब मैं एक उपयोगकर्ता आदेश का उपयोग कर चलाना चाहते हैं: groovy.lang.MissingMethodException: No signature of method: Script2.prnt() is applicable for argument types: (java.lang.Integer) values: [66]

कैसे मेरे उपयोगकर्ता स्क्रिप्ट का उपयोग तरीकों पहले से ही भरा हुआ है सकते हैं: मैं त्रुटि मिलती है

gShell.evaluate("prnt 66"); 

?

नोट: मैंने "autoload.prnt 88" भी कोशिश की है, और अभी भी त्रुटि प्राप्त है।

उत्तर

4

प्रत्येक evaluate कॉल संकलित और एक अलग Script रूप में चलाया जाता है, और

def prnt(m) { 
    println("From Groovy: " + m); 
} 

autoload.groovy से उत्पन्न स्क्रिप्ट वर्ग है, जो बाद "को" स्क्रिप्ट से सुलभ नहीं है में एक विधि को परिभाषित करता है। हालांकि, उसी GroovyShell द्वारा चलाए गए स्क्रिप्ट उसी बाध्यकारी साझा करते हैं, ताकि आप एक स्क्रिप्ट से बाइंडिंग में मानों को संग्रहीत कर सकें और उन्हें दूसरे में एक्सेस कर सकें। बंधन में एक मूल्य के भंडारण बस एक अन्यथा अघोषित चर के लिए मान निर्दिष्ट का एक मामला है:

prnt = { m -> 
    println("From Groovy: " + m); 
} 

यह बाध्यकारी चर prnt में एक बंद संग्रहीत करता है, और आप एक ही खोल में अन्य लिपियों से बंद कॉल कर सकते हैं । ध्यान दें कि

def prnt = { m -> 

या

Closure prnt = { m -> 

होगा नहीं काम, def या प्रकार यह एक स्थानीय चर घोषणा (इस विशेष स्क्रिप्ट के लिए निजी) के बजाय बंधन को एक काम करता है क्योंकि।

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