を助け、そのコンテキストオブジェクトを注入する方法を示すコードスニペットで、コンフィギュレーションプロパティとクラスパス。
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
Grailsのこれ以降、同様のソリューションになっています:Script dslScript = new GroovyShell(grailsApplication.classLoader).parse(dsl.text) –
PermSpaceの問題を解決しますか?これはクラス情報を残して実行できます。最終的にはPermSpaceからここをクリックしてください: http://stackoverflow.com/questions/24169976/understanding-groovy-grails-classloader-leak https://issues.apache.org/jira/browse/GROOVY-2875 サーバーアプリケーションのためにお勧めできますか? –
それはしばらくしていますが、まだ新しいクラスをコンパイルしていると思います。その場合、効果は 'parseClass'に似ています – clmarquart