gpt4 book ai didi

java - Jboss 7 中的 GroovyScriptEngine 类加载

转载 作者:行者123 更新时间:2023-11-30 03:46:00 25 4
gpt4 key购买 nike

我在使用 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 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 groovy 提供数据,例如:

...
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。如果此类包含在资源适配器存档中,则它可以正常工作,因此脚本似乎只能看到资源适配器中包含的类。

除了包括资源适配器上的所有额外类(当前的解决方法)之外,您对如何解决此问题有任何想法吗?非常感谢。

最佳答案

我以前没有遇到过这个特定问题,但我在获取 JBoss 部署的 war 文件来获取 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 也包含在全局模块中,尽管我也认为这是一种解决方法。

关于java - Jboss 7 中的 GroovyScriptEngine 类加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25688639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com