分析自己的DSL时GroovyShell的类加载器问题
我尝试使用分析自己的DSL时GroovyShell的类加载器问题,groovy,osgi,Groovy,Osgi,我尝试使用GroovyShell执行自定义DSL: class DslScriptLoader { static runScript(String dsl) { CompilerConfiguration config = new CompilerConfiguration(CompilerConfiguration.DEFAULT) config.scriptBaseClass = 'com.my.MyDslBaseClass' config.addCompila
GroovyShell
执行自定义DSL:
class DslScriptLoader {
static runScript(String dsl) {
CompilerConfiguration config = new CompilerConfiguration(CompilerConfiguration.DEFAULT)
config.scriptBaseClass = 'com.my.MyDslBaseClass'
config.addCompilationCustomizers(
new ASTTransformationCustomizer(TypeChecked)
)
assert DslScriptLoader.classLoader.loadClass('groovy.lang.GroovyObject') != null
def shell = new GroovyShell(new Binding(), config)
def script = shell.parse(dsl)
// ...
}
}
当我在IDE中本地运行时,一切正常。但是,只要我在基于OSGi的容器中运行它,就会出现以下异常:
Caused by: java.lang.ClassNotFoundException: groovy.lang.GroovyObject
error 23-Mar-2016 14:14:35 at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
error 23-Mar-2016 14:14:35 at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
error 23-Mar-2016 14:14:35 at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:677)
error 23-Mar-2016 14:14:35 at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:787)
error 23-Mar-2016 14:14:35 at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:775)
error 23-Mar-2016 14:14:35 ... 66 more
error 23-Mar-2016 14:14:35 1 error
error 23-Mar-2016 14:14:35 at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
error 23-Mar-2016 14:14:35 at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1075)
error 23-Mar-2016 14:14:35 at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:591)
error 23-Mar-2016 14:14:35 at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569)
error 23-Mar-2016 14:14:35 at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546)
error 23-Mar-2016 14:14:35 at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
error 23-Mar-2016 14:14:35 at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
error 23-Mar-2016 14:14:35 at groovy.lang.GroovyShell.parseClass(GroovyShell.java:694)
error 23-Mar-2016 14:14:35 at groovy.lang.GroovyShell.parse(GroovyShell.java:706)
error 23-Mar-2016 14:14:35 at groovy.lang.GroovyShell.parse(GroovyShell.java:742)
error 23-Mar-2016 14:14:35 at groovy.lang.GroovyShell.parse(GroovyShell.java:733)
error 23-Mar-2016 14:14:35 at groovy.lang.GroovyShell$parse.call(Unknown Source)
error 23-Mar-2016 14:14:35 at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
error 23-Mar-2016 14:14:35 at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
error 23-Mar-2016 14:14:35 at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
你知道是什么导致了这个问题吗?当不是我在ctor中传递的类装入器时,GroovyShell
使用哪个类装入器
提前感谢,
Michael您已经在osgi容器中部署了groovy all吗?默认情况下,groovy使用groovy捆绑包的类加载器,它有一个动态ImportPackage语句:它可以在META-INF/lib中查看containerI捆绑包groovy-all.jar中的所有类以及我的jar,并在my MANIFEST.MF中引用它,如下所示:捆绑包类路径:。,META-INF/lib/groovy-all-2.4.4.jar您在osgi容器中部署了groovy-all吗?默认情况下,groovy使用groovy捆绑包的类加载器,它有一个动态ImportPackage语句:它可以在META-INF/lib中看到containerI捆绑包groovy-all.jar中的所有类以及我的jar,并在my MANIFEST.MF中引用它,如下所示:捆绑包类路径:,META-INF/lib/groovy-all-2.4.4.jar
def shell = new GroovyShell(DslScriptLoader.classLoader, new Binding(), config)