groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Rüegg <rueegg.mich...@gmail.com>
Subject ClassLoader issue when loading custom DSL with GroovyScriptEngine
Date Thu, 24 Mar 2016 12:39:37 GMT
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
Mime
View raw message