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

Posted

技术标签:

【中文标题】尝试使用 Rhino,getEngineByName("JavaScript") 在 OpenJDK 7 中返回 null【英文标题】:Trying to use Rhino, getEngineByName("JavaScript") returns null in OpenJDK 7 【发布时间】:2012-04-20 16:58:13 【问题描述】:

当我运行以下代码时,当我使用 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下。

【问题讨论】:

另见Javascript engine can not be found; JDK 提供者可以选择要打包的脚本引擎(如果有的话)。 有趣,jdk 7 在 debian 上对我有同样的问题。 jdk6的jrunsript运行javascript引擎,jdk 7 jrunsript打印“engine for language js cannot be found”。 注意:您不能确定给定的脚本引擎是否可用。如果您真的需要它,请自己携带。 Fixed in 7~u3-2.1.1~pre1-1ubuntu2 在 OSX 上有同样的问题,如果有人能回答 如何 提供我自己的服务,我会投赞成票。我试过只在类路径上放 rhino jar,但它不工作 【参考方案1】:

[更新:这是一个错误,现在有 been fixed]

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

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,但没有书面理由,所以我提交了bug #982501 in the Ubuntu OpenJDK 7 launchpad。收到后会给出更好的答案。

1 根据this thread,

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

还有一些由 JRE 版本和 BYOR(bring-you-own-Rhino)版本(例如 bug #255149 on Ubuntu OpenJDK 7 launchpad)冲突引起的冲突问题。但是,来源在 OpenJDK 7 中的 source 和 makefile 中提到的,和上面线程中提到的 BSD 端口具有相同的 sources。

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

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

与它们被签入 OpenJDK mercurial 的事实有所不同,但我认为这个想法是 Rhino 不在 JDK 规范中。

【讨论】:

在 7~u3-2.1.1~pre1-1ubuntu2 中修复【参考方案2】:

你必须注册Rhino服务,但我不知道具体怎么做,是通过在META-INF里面创建一个文件

或者你可以跳过Script API直接使用。

检查这个基本示例:

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

【讨论】:

以上是关于尝试使用 Rhino,getEngineByName("JavaScript") 在 OpenJDK 7 中返回 null的主要内容,如果未能解决你的问题,请参考以下文章

使用 require.js 和 Java/Rhino 解析模块

使用 .Net Framework 1.1 在 Visual Studio 2003 上模拟 Rhino

如何使用 Rhino Mocks 模拟任意行为?

Java 变量参数和 rhino

使用 Rhino(Mozilla 的 rhino)的优点

Rhino 中的 XMLHttpRequest?