分析自己的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)