尝试使用 Rhino,getEngineByName(“JavaScript”) 在 OpenJDK 7 中返回 null

2022-09-04 04:42:34

当我运行以下代码片段时,变量设置为当我使用OpenJDK 7()时。enginenulljava-7-openjdk-i386

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class TestRhino {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        try {
            System.out.println(engine.eval("1+1"));
        } catch (ScriptException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

它与甲骨文的.任何想法为什么?java-6-openjdkjre1.7.0

我使用的是 Ubuntu 11.10。所有 JVM 都安装在 下。/usr/lib/jvm


答案 1

[更新:这是一个错误,现已修复]

简而言之,这可能是一个错误。

Rhino 支持类 () 没有编译成 1(尽管我发现引用这是 Sun 和 Mozilla 之间的合并问题,而且我知道存在命名空间问题,它们确实存在于 OpenJDK 7 源代码中,并在 makefile 中引用),并且它们也从 中丢失。OpenJDK 6的情况并非如此,它以此作为条目:com.sun.script.javascript.*rt.jarresources.jarMETA-INF/servicesMETA-INF/services/javax.script.ScriptEngineFactory

#script engines supported

com.sun.script.javascript.RhinoScriptEngineFactory #javascript

虽然这可能是一个发行版决定2,但没有书面原因,所以我在Ubuntu OpenJDK 7启动板中提交了一个错误#982501。一旦我得到一个更好的答案,我会给出一个更好的答案。

1 根据此线程

我在某处听说Mozilla不接受Suns的更改进入他们的主线分支,原因不明,但那是在开源之前。

还有一些由JRE版本和BYOR(自带犀牛)版本冲突引起的冲突问题(例如,Ubuntu OpenJDK 7启动板上的错误#255149)。但是,源代码位于OpenJDK 7源代码中,并在makefile中提到,并且上述线程中提到的BSD端口具有相同的来源

2 根据这个 Sun bug #6876736,这是一个基于发行版的决定:

犀牛源不是OpenJDK的一部分,由发行版添加它。

与它们被检查到OpenJDK mercurial的事实形成鲜明对比,但我认为这个想法是Rhino不在JDK规范中。


答案 2

你必须注册Rhino服务,但我不知道具体是如何注册的,是通过在META-INF内部创建一个文件。

或者,您可以跳过脚本 API 并直接使用它。

检查此基本示例:

https://github.com/mozilla/rhino/blob/master/examples/Control.java