我在使用Jboss中的GroovyScriptEngine移植Java獨立程序時遇到了問題。GroovyScriptEngine在Jboss中加載類7
我的程序啓動groovy腳本,它需要動態加載類來啓動它們。 它確實像下面這樣:
ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
final String myJarPath = "/tmp/myJar.jar";
URLClassLoader loader = null;
try {
final URL url = new File(myJarPath).toURI().toURL();
loader = new URLClassLoader(new URL[] { url},oldLoader);
} catch (MalformedURLException e) {
e.printStackTrace();
}
Thread.currentThread().setContextClassLoader(loader);
ScriptEngineManager seManager = new ScriptEngineManager(loader);
final Map<String, Object> bindingAttributes = new HashMap<>() ;
final ScriptEngine scriptEngine = seManager.getEngineByName("groovy");
final SimpleBindings simpleBindings = new SimpleBindings(bindingAttributes);
scriptEngine.setBindings(simpleBindings, ScriptContext.GLOBAL_SCOPE);
FileReader fileReader = null;
BufferedReader bufferedReader = null;
fileReader = new FileReader(new File("/my/path/to/groovyFile/file.groovy"));
bufferedReader = new BufferedReader(fileReader);
final Object eval = scriptEngine.eval(bufferedReader);
System.out.println(eval);
在myJar.jar存在由Groovy腳本所需的類,而不是由啓動常規scrits本身的Java程序。 以這種方式很好地工作:我只需要包含以下maven依賴項。
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.3.6</version>
</dependency>
如果我把我的代碼在資源適配器(一個JCA連接),但我已經添加了所有必需的依賴,當我這樣做:
final ScriptEngine scriptEngine = seManager.getEngineByName("groovy");
我得到一個NullPointerException。
如果我嘗試喂對於ScriptEngineManager手動registerig時髦,比如:
...
Thread.currentThread().setContextClassLoader(loader);
ScriptEngineManager seManager = new ScriptEngineManager(loader);
final Map<String, Object> bindingAttributes = new HashMap<>() ;
############################################
## register it manually ##
############################################
final GroovyScriptEngineFactory factory = new GroovyScriptEngineFactory();
seManager.registerEngineName("groovy", factory);
final ScriptEngine scriptEngine = seManager.getEngineByName("groovy");
final SimpleBindings simpleBindings = new SimpleBindings(bindingAttributes);
scriptEngine.setBindings(simpleBindings, ScriptContext.GLOBAL_SCOPE);
final GroovyScriptEngineFactory factory = new GroovyScriptEngineFactory();
seManager.registerEngineName("groovy", factory);
final ScriptEngine scriptEngine = seManager.getEngineByName("groovy");
腳本被加載,但classpath中不包含在myJar.jar提供的額外類。 所以我得到一個ClassNotFoundException。 如果此類包含在資源適配器歸檔中,它可以正常工作,所以看起來腳本只能看到資源適配器中包含的類。
除了包括資源適配器上的所有額外類(當前woraround)之外,您對於如何解決此問題有任何想法嗎? 非常感謝。
你搖滾人!它就像一個魅力! – JayZee 2014-09-08 10:33:46