簡體   English   中英

如何在隔離的類加載器中執行groovy腳本?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM