我在Jboss内部使用GroovyScriptEngine移植一个Java独立程序时遇到了问题。
我的程序启动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脚本所需要的,而不是启动groovy本身的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寄存器,例如:
...
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");脚本将加载,但类路径不包含myJar.jar中提供的额外类。所以我得到了一个ClassNotFoundException。如果这个类包含在资源适配器存档中,它可以正常工作,因此脚本似乎只能看到资源适配器中包含的类。
除了资源适配器上的所有额外类外,您是否知道如何解决这个问题(当前的工作)。非常感谢。
发布于 2014-09-05 17:56:16
我以前没有遇到过这个特定的问题,但是我在获得文件以获得Groovy脚本引擎时遇到了问题。为了解决问题,我所做的就是创建一个全局Groovy模块:
1)创建目录$JBOSS_HOME/modules/org/codehaus/groovy/main/
2)将groovy-all-2.3.6.jar复制到该目录中。
3)在同一个目录中创建一个具有以下内容的module.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.codehaus.groovy">
<resources>
<resource-root path="groovy-all-2.3.6.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
</dependencies>
</module>4)修改standalone.xml中的"urn:jboss:domain:ee:1.1“子系统元素(或您使用的任何样式),将刚刚创建的模块作为全局模块包括在内。
<subsystem xmlns="urn:jboss:domain:ee:1.1">
<spec-descriptor-property-replacement>false</spec-descriptor-property-replacement>
<jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement>
<global-modules>
<module name="org.codehaus.groovy" slot="main"/>
</global-modules>
</subsystem>如果它仍然不起作用,可能还需要将myJar.jar包括在全局模块中,尽管我也认为这是一个解决办法。
https://stackoverflow.com/questions/25688639
复制相似问题