2012-01-04 33 views
5

Đối với nền, tôi đang thử nghiệm bằng cách viết trình phân tích cú pháp DSL, sử dụng tuyệt vời example này. Thật không may khi tôi điều chỉnh dòng này để sử dụng trong ứng dụng của riêng tôi:Cách tạo đối tượng GroovyShell với đường dẫn lớp của ứng dụng ngữ cảnh

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

Tôi nhận được lỗi phân giải lớp khi chạy, vì các tệp miền DSL có mã tham chiếu đến các lớp bên ngoài khác. Ứng dụng ngữ cảnh có quyền truy cập vào các lớp này, nhưng tôi không biết cách cấp quyền truy cập chúng cho đối tượng GroovyShell mới, hoặc bằng cách nào đó, hãy sử dụng môi trường thời gian chạy của ứng dụng ngữ cảnh để phân tích cú pháp tệp.

Trả lời

6

Bạn đã cố gắng sử dụng các nhà xây dựng sau đây: public GroovyShell(ClassLoader parent)

Như thế này: Script dslScript = new GroovyShell(this.class.classLoader).parse(dsl.text)

Hy vọng rằng sẽ giúp ...

+0

Đúng. Chỉ cần đến một giải pháp tương tự vì điều này trong Grails: Script dslScript = new GroovyShell (grailsApplication.classLoader) .parse (dsl.text) –

+0

Điều này có giải quyết được vấn đề với PermSpace không, nơi này để lại thông tin lớp ở đó và bạn có thể chạy ra khỏi PermSpace cuối cùng? Xem tại đây: http://stackoverflow.com/questions/24169976/understanding-groovy-grails-classloader-leak https://issues.apache.org/jira/browse/GROOVY-2875 Vì vậy, tôi tự hỏi nếu điều này có thể được đề nghị cho các ứng dụng máy chủ hay không, –

+0

Đã lâu rồi, nhưng tôi tưởng tượng nó vẫn chỉ biên dịch một lớp mới. Nếu đúng như vậy, hiệu ứng sẽ tương tự như 'parseClass' – clmarquart

7

Đây là một đoạn mã cho thấy làm thế nào để tiêm một đối tượng bối cảnh, cấu hình thuộc tính và classpath.

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(); 
} 

Lưu ý rằng mã này cũng sẽ tiêm lớp cơ sở để giành quyền kiểm soát tốt về phân tích thuộc tính và hỗ trợ kế thừa giữa các tệp DSL khác nhau. Để biết thêm thông tin và mã nguồn hoạt động từ dự án Cloudify, hãy xem http://cloudifysource.tumblr.com/post/23046765169/parsing-complex-dsls-using-groovy

Các vấn đề liên quan