2012-01-04 9 views
5

पृष्ठभूमि के लिए ग्रोवीशेल ऑब्जेक्ट कैसे बनाएं, मैं इस महान example का उपयोग करके एक डीएसएल पार्सर लिखने के साथ प्रयोग कर रहा हूं। दुर्भाग्य से जब मैं अपने खुद के अनुप्रयोग में उपयोग के लिए इस लाइन अनुकूलन:संदर्भ ऐप के क्लासपाथ

Script dslScript = new GroovyShell().parse(dsl.text) 

मैं कार्यावधि में वर्ग संकल्प त्रुटियों मिलता है, के रूप में मेरे डीएसएल डोमेन फ़ाइलें कोड अन्य बाहरी कक्षाओं का संदर्भ देता है है। संदर्भ ऐप में इन कक्षाओं तक पहुंच है, लेकिन मुझे नहीं पता कि नई ग्रोवीशेल ऑब्जेक्ट तक उन्हें कैसे पहुंचाया जा सकता है, या वैकल्पिक रूप से किसी भी तरह से फ़ाइल को पार्स करने के लिए संदर्भ ऐप के रनटाइम पर्यावरण का उपयोग करें। public GroovyShell(ClassLoader parent)

इस तरह

:

उत्तर

6

आप निम्नलिखित निर्माता उपयोग करने की कोशिश है Script dslScript = new GroovyShell(this.class.classLoader).parse(dsl.text)

आशा है कि मदद करता है ...

+0

हाँ देखें। Grails में यह एक समान समाधान के लिए आया था: स्क्रिप्ट dslScript = new groovyShell (grailsAplication.classLoader) .parse (dsl.text) –

+0

क्या यह पर्मस्पेस के साथ समस्याओं को हल करता है, जहां यह कक्षा की जानकारी छोड़ देता है और आप दौड़ सकते हैं अंत में पर्मस्पेस से बाहर? यहां देखें: http://stackoverflow.com/questions/24169976/understanding-groovy-grails-classloader-leak https://issues.apache.org/jira/browse/GROOVY-2875 इस प्रकार मुझे आश्चर्य है कि यह है या नहीं सर्वर ऐप्स के लिए अनुशंसित किया जा सकता है या नहीं, –

+0

यह थोड़ी देर हो गया है, लेकिन मुझे कल्पना है कि यह अभी भी एक नई कक्षा को संकलित कर रहा है। यदि ऐसा है, तो प्रभाव 'parseClass' के समान होगा – clmarquart

7

कोड स्निपेट से पता चलता है कि कैसे एक संदर्भ वस्तु, विन्यास इंजेक्षन करने के लिए है गुण और कक्षापाथ।

Service parse(
String dslFile, List<String> classpath, 
Map<String, Object> properties, ServiceContext context) { 

// add POJO base class, and classpath 
CompilerConfiguration cc = new CompilerConfiguration(); 
cc.setScriptBaseClass(BaseDslScript.class.getName()); 
cc.setClasspathList(classpath); 

// inject default imports 
ic = new ImportCustomizer(); 
ic.addImports(ServiceUtils.class.getName()); 
cc.addCompilationCustomizers(ic); 

// inject context and properties 
Binding binding = new Binding(); 
binding.setVariable("context", context); 
for (prop: properties.entrySet()) { 
    binding.setVariable(prop.getKey(), prop.getValue()); 
} 

// parse the recipe text file 
ClassLoader classloader = this.class.getClassLoader(); 
GroovyShell gs = new GroovyShell(classloader, binding, cc); 
FileReader reader = new FileReader(dslFile); 
try { 
    return (Service) gs.evaluate(reader); 
} finally { 
    reader.close(); 
} 

सूचना है कि इस कोड भी विभिन्न डीएसएल फ़ाइलों के बीच उत्तराधिकार के लिए संपत्ति पार्स करने और समर्थन पर ठीक बेहतर नियंत्रण हासिल करने के आधार वर्ग injects। क्लाउडफी परियोजना से अधिक जानकारी और कार्य स्रोत कोड के लिए http://cloudifysource.tumblr.com/post/23046765169/parsing-complex-dsls-using-groovy

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