【发布时间】:2016-06-30 13:11:21
【问题描述】:
我正在尝试使用 GroovyClassLoader 和 GroovyScriptEngineImpl 在我的 Java 应用程序中运行 Groovy 脚本,并且我想将 Groovy 脚本与父应用程序上下文隔离开来。
我的意思是,当我运行我的 Groovy 脚本时,我不希望它从我的 Java 应用程序中加载的依赖项继承,以便能够在我的脚本中加载 Gson 2.5.5 ,即使我的 Java 应用程序正在使用 Gson 3.4.1。
// Replacing the context class loader with the system one
ClassLoader initialCL = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader().getParent());
// Creating my GroovyClassLoader and GroovyScriptEngine
GroovyClassLoader groovyCL = new GroovyClassLoader();
GroovyScriptEngineImpl scriptEngine = new GroovyScriptEngineImpl(groovyCL);
// Compiling and running my Groovy script
CompiledScript compiledScript = scriptEngine.compile("println \"hello\"");
compiledScript.eval();
// Going back to my initial classloader
Thread.currentThread().setContextClassLoader(initialCL);
这样,隔离确实起作用了,但是脚本的内容根本没有执行(例如在控制台中打印一行),而且我在任何地方都没有错误。
如果我在创建新的GroovyClassLoader 之前没有更新我的上下文类加载器,则脚本可以正常工作,但它是从父依赖项继承的。
你有什么想法吗?
谢谢:)
更新 :经过更多测试,编译似乎工作正常,但编译脚本的评估没有做任何事情。实际上,当我尝试编译一个脚本时遇到错误,该脚本没有所需的所有依赖项,即使它们存在于我的 Java 应用程序类路径中。
【问题讨论】:
标签: java groovy classloader