【问题标题】:How can I execute groovy scripts in an isolated classloader?如何在隔离的类加载器中执行 groovy 脚本?
【发布时间】:2017-10-31 07:11:30
【问题描述】:

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

    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&lt;T&gt;,其中 T 是脚本本身的名称。

我的理论是,这是由于 groovy 通过反射从脚本中创建合成类的方式,调用类中运行的 groovy 运行时与独立类加载器中运行的 groovy 运行时之间的二进制不兼容造成的。

关于如何实现这一点的任何想法?

【问题讨论】:

  • 我也会尝试从该类加载器中实例化 GroovyScriptEngine。看起来生成的类不是 100% 孤立的

标签: java groovy classloader urlclassloader groovyclassloader


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2012-02-18
    相关资源
    最近更新 更多