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



当我运行以下代码时,当我使用OpenJDK 7(java-7-openjdk-i386)时,engine变量被设置为null

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-openjdk和Oracle的jre1.7.0一起运行良好。知道为什么吗?

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

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

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

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

#script engines supported
com.sun.script.javascript.RhinoScriptEngineFactory #javascript

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

1根据这个线程,

我在某个地方听说Mozilla不接受Suns将其更改为主线分支,原因未知,但那是在开源之前。

JRE和BYOR(自带Rhino)版本的冲突也导致了一些冲突问题(例如Ubuntu OpenJDK 7启动板上的错误#255149)。然而,源代码在OpenJDK7源代码中,并在makefile中提到,而在上面的线程中提到的BSD端口具有相同的源代码。

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

rhino源代码不是OpenJDK的一部分,由发行版来添加它

这与它们被签入OpenJDK mercurial的事实形成了一定的对比,但我认为Rhino不在JDK规范中。

您必须通过在META-INF 中创建一个文件来注册Rhino服务,但我不知道具体如何注册

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

检查这个基本示例:

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

相关内容

  • 没有找到相关文章

最新更新