I don't see why you need the GroovyScriptEngine. Maybe the GroovyShell would be 
the more appropriate choice to run scripts in this example? In a similar 
situation in an OSGi bundle I have used:

GroovyClassLoader GROOVY_CLASSLOADER = new GroovyClassLoader();
Class<?> clazz = GROOVY_CLASSLOADER.parseClass(string_with_script_as_text);
Object cc = clazz.newInstance();
Script script = (Script) cc;

And then on the script you can just call: script.setBinding()

And to run I call: script.run(). 


-----Original Message-----
From: Michael Rüegg [mailto:[email protected]] 
Sent: Donnerstag, 24. März 2016 13:40
To: [email protected]
Cc: Michael Rüegg <[email protected]>
Subject: ClassLoader issue when loading custom DSL with GroovyScriptEngine

Hi,

I have a problem with parsing my own DSL when using GroovyScriptEngine. Here’s 
the code:

class DslLoader {

 def load(String dsl) {
   CompilerConfiguration config = new 
CompilerConfiguration(CompilerConfiguration.DEFAULT)
   config.scriptBaseClass = MyBaseScript.class.name
   ClassLoader parentClassLoader = DslScriptLoader.classLoader
   GroovyClassLoader groovyClassLoader = new 
GroovyClassLoader(parentClassLoader, config)
   assert parentClassLoader.loadClass('groovy.lang.GroovyObject') != null // NO 
PROBLEMS HERE
   URL url = new File(‘path/to/my-dsl.jar').toURI().toURL()
   URL[] urlRoots = [url]
   GroovyScriptEngine engine = new GroovyScriptEngine(urlRoots, 
groovyClassLoader)
   assert engine.groovyClassLoader.loadClass('groovy.lang.GroovyObject') != 
null // NO PROBLEMS HERE
   Class clazz = engine.groovyClassLoader.parseClass(dsl, 'script’) // HERE I 
GET java.lang.ClassNotFoundException: groovy.lang.GroovyObject
   script = InvokerHelper.createScript(clazz, new Binding())  }

}


As you can see from the comments, I’m able to load the class 
‘groovy.lang.GroovyObject’ when using the same class loader I pass to 
GroovyScriptEngine. But when I call parseClass(), my application fails with a 

java.lang.ClassNotFoundException: groovy.lang.GroovyObject

The code above is part of an OSGI bundle which is deployed to a container. 
groovy-all.jar is on the bundle class path: 

Bundle-ClassPath: .,META -INF/lib/groovy-all-2.4.4.jar 

I don’t understand why GroovyScriptEngine is not able to load Groovy’s own 
classes although the passed class loader can do it. Am I overlooking something? 
Do you have an idea what is wrong?

Thanks in advance,
Michael

This e-mail message contains confidential information and is intended only for 
the named recipient(s). If you are not an intended recipient, any disclosure, 
copying or distribution is prohibited. Please notify the sender immediately by 
e-mail if you have received this message in error and delete this message from 
your system. As internet communications are not secure, the Swiss National Bank 
accepts no liability for any errors or omissions in the contents of this 
message. Any views expressed in this message are those of the individual 
sender, except where the sender specifically states them to be the views of the 
Swiss National Bank.

Reply via email to