![](/img/trans.png)
[英]How can I add a shared library (set to use “isolated classloader”) Websphere?
[英]How can I execute groovy scripts in an isolated classloader?
我正在尝试在隔离的类加载器中运行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
摘录 :
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)
我试过的上述任何变化都会导致
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运行时与在独立类加载器中运行的groovy运行时之间的二进制不兼容引起的,这是由于groovy通过反射从脚本创建合成类的方式。
关于如何实现这一点的任何想法?
尝试不是直接创建GroovyScriptEngine
,而是通过rootLoader.loadClass()
并通过反射调用engine.run
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.