java - 为什么 JRuby ScriptManager.getEngineByName 返回 null?

标签 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],而在坏的情况下我只有 [犀牛].

有人知道发生了什么吗?

最佳答案

我对 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 中有一个特殊的文件,用于注册各种脚本容器:

The ScriptEngineManager uses the service provider mechanism described in the Jar File Specification to obtain instances of all ScriptEngineFactories available in the current ClassLoader.

我的猜测是,第一种情况下 JVM 不需要加载 JRuby jar,因此它还没有注册脚本引擎。它只会在找不到某个类时加载该 jar。这意味着您可能能够在调用脚本之前通过使用某些 JRuby 对象来强制它工作。

关于java - 为什么 JRuby ScriptManager.getEngineByName 返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21296107/

相关文章:

java - WordSearch 类的 boolean 问题

java - Spring框架中@Import和@ImportResource注解的使用有什么区别?

java - 在 Ant jar 任务期间创建目录结构

ruby - 新的 Ruby 1.9 哈希语法

包含超过给定长度的非 ASCII 的 Java RegEx 匹配字符串

java - 使用自定义容器作为 TestContainer 的数据库

java - JAVA代码触发Hadoop命令

java - 写入文件以创建 JAR 时出现 NullPointerException

java - 将 Artemis ESF 与 JRuby 结合使用

cucumber - 将 cucumber 与 jruby 一起使用