为什么JRuby ScriptManager.getEngineByName返回null?

时间:2014-01-22 23:16:11

标签: java jar jruby

这篇文章与这篇文章有关:How to put properly a libgdx application inside swing application?但问题不同。

在这篇文章中,我解释说我有两个JAR:WorldEditor.jarGameEngine.jar,我在运行时从GameEngine.jar加载WorldEditor.jar

我的问题在于GameEngine.jar中包含的一个库,即JRuby。

当我运行java -jar GameEngine.jar时一切都很好,但是当我发出java -jar worldEditor.jar时,JRuby ScriptManager的实例在我调用``getEngineByName`时返回null。我只是不能指出你是什么问题。

通过跟踪ScriptManagerFactories的列表,我看到了好的情况,我有[JRuby, Rhino],而在坏的情况下,我只有[Rhino]

有人知道发生了什么事吗?

1 个答案:

答案 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对象强制它工作。