如何在隔离的类加载器中执行 groovy 脚本?

How can I execute groovy scripts in an isolated classloader?

我正在尝试 运行 groovy 脚本在一个隔离的 class 加载器中,这样它们就不会在调用 class' 依赖项的上下文中执行。

    Path log4j = Paths.get("..../lib/log4j-1.2.17.jar");
    Path groovy = Paths.get("..../lib/groovy-all-2.1.3.jar");
    RootLoader rootLoader = new RootLoader(new URL[] { log4j.toUri().toURL(), groovy.toUri().toURL() }, null);
    GroovyScriptEngine engine = new GroovyScriptEngine(".../src/main/resources", rootLoader);
    engine.run("Standalone.groovy", "");
Standalone.groovy:
import org.apache.log4j.BasicConfigurator
import org.apache.log4j.Logger

Logger logger = Logger.getLogger(getClass())
BasicConfigurator.configure()
logger.info("hello world")
pom.xml摘录
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.1.3</version>
    </dependency>

我尝试过的上述任何变体都会导致

Exception in thread "main" groovy.lang.GroovyRuntimeException: Failed to create Script instance for class: class Standalone. Reason: java.lang.ClassCastException: Standalone cannot be cast to groovy.lang.GroovyObject
    at org.codehaus.groovy.runtime.InvokerHelper.createScript(InvokerHelper.java:443)
    at groovy.util.GroovyScriptEngine.createScript(GroovyScriptEngine.java:564)
    at groovy.util.GroovyScriptEngine.run(GroovyScriptEngine.java:551)
    at groovy.util.GroovyScriptEngine.run(GroovyScriptEngine.java:537)

我已经将其追溯到 groovy.util.GroovyScriptEngine#loadScriptByName,其中脚本被解析为 Class<T>,其中 T 是脚本本身的名称。

我的理论是,这是由于 groovy 运行time 运行ning 在调用 class 和 groovy 运行time 运行在独立的 class 加载器中,由于 groovy 通过反射从脚本中创建合成 classes 的方式。

关于如何实现这一点有什么想法吗?

尝试不直接创建 GroovyScriptEngine,而是通过 rootLoader.loadClass() 并通过反射调用 engine.run