2012-01-04 7 views
5

バックグラウンドでは、この偉大なexampleを使用して、DSLパーサーを作成することを実験しています。残念ながら、私は自分のアプリで使用するためにこのラインを合わせるとき:コンテキストアプリケーションのクラスパスを使用してGroovyShellオブジェクトを作成する方法

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

私のDSLドメインファイルは、他の外部のクラスを参照するコードを持っているとして、私は、実行時にクラスの解決エラーが発生します。コンテキストアプリケーションはこれらのクラスにアクセスできますが、新しいGroovyShellオブジェクトにアクセスする方法を知らないか、あるいは何らかの形でコンテキストアプリケーションのランタイム環境を使ってファイルを解析します。このようpublic GroovyShell(ClassLoader parent)

答えて

6

では、次のコンストラクタを使用してみましたがScript dslScript = new GroovyShell(this.class.classLoader).parse(dsl.text)

・ホープここで...

+0

Grailsのこれ以降、同様のソリューションになっています:Script dslScript = new GroovyShell(grailsApplication.classLoader).parse(dsl.text) –

+0

PermSpaceの問題を解決しますか?これはクラス情報を残して実行できます。最終的にはPermSpaceからここをクリックしてください: 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(); 
} 

このコードはまた、財産の解析と異なるDSLファイル間の継承のための支持体上に、きめ細かい制御を得るために、基本クラスを注入することを注意してください。 詳細については、Cloudifyプロジェクトのソースコードを参照してください。 http://cloudifysource.tumblr.com/post/23046765169/parsing-complex-dsls-using-groovy

関連する問題