这篇文章与这篇文章有关:How to put properly a libgdx application inside swing application?但问题不同。
在这篇文章中,我解释说我有两个JAR:WorldEditor.jar
和GameEngine.jar
,我在运行时从GameEngine.jar
加载WorldEditor.jar
。
我的问题在于GameEngine.jar
中包含的一个库,即JRuby。
当我运行java -jar GameEngine.jar
时一切都很好,但是当我发出java -jar worldEditor.jar
时,JRuby ScriptManager
的实例在我调用``getEngineByName`时返回null。我只是不能指出你是什么问题。
通过跟踪ScriptManagerFactories
的列表,我看到了好的情况,我有[JRuby, Rhino]
,而在坏的情况下,我只有[Rhino]
。
有人知道发生了什么事吗?
答案 0 :(得分:1)
我对Java的ScriptEngine
没有多少经验,但我在这里回答了另一个问题时遇到了这个问题。我认为你的问题归结为类路径顺序问题。
使用此代码:
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Script {
public static void main(String args[]) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("jruby");
System.out.println(engine);
}
}
如果我以两种不同的方式运行它,我得到两个不同的结果:
$ java -cp .:jruby.jar Script
null
$ java -cp jruby.jar:. Script
org.jruby.embed.jsr223.JRubyEngine@30c01f1c
稍微观察一下,jar中有一个特殊文件可以注册各种脚本容器:
ScriptEngineManager使用所描述的服务提供程序机制 在Jar文件规范中获取所有实例 ScriptEngineFactories在当前的ClassLoader中可用。
我的猜测是JVM不需要在第一种情况下加载JRuby jar,因此它没有注册脚本引擎。它只会在找不到某个类时加载该jar。这意味着可能能够在调用脚本之前使用某个JRuby对象强制它工作。