首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jboss 7中的GroovyScriptEngine类加载

Jboss 7中的GroovyScriptEngine类加载
EN

Stack Overflow用户
提问于 2014-09-05 14:52:23
回答 1查看 688关注 0票数 2

我在Jboss内部使用GroovyScriptEngine移植一个Java独立程序时遇到了问题。

我的程序启动groovy脚本,它需要动态加载类来启动它们。它所做的事情如下:

代码语言:javascript
复制
  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依赖项。

代码语言:javascript
复制
   <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.3.6</version>
    </dependency>

如果我将代码移植到资源适配器( JCA连接器)中,尽管我已经添加了所有所需的依赖项,当我这样做时:

代码语言:javascript
复制
final ScriptEngine scriptEngine = seManager.getEngineByName("groovy");

我得到了一个NullPointerException。

如果我尝试手动提供ScriptEngineManager寄存器,例如:

代码语言:javascript
复制
...
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。如果这个类包含在资源适配器存档中,它可以正常工作,因此脚本似乎只能看到资源适配器中包含的类。

除了资源适配器上的所有额外类外,您是否知道如何解决这个问题(当前的工作)。非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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文件:

代码语言:javascript
复制
<?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“子系统元素(或您使用的任何样式),将刚刚创建的模块作为全局模块包括在内。

代码语言:javascript
复制
<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包括在全局模块中,尽管我也认为这是一个解决办法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25688639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档