【问题标题】:Running ECMAScript 5 compliant javascript on Java 7在 Java 7 上运行 ECMAScript 5 兼容的 javascript
【发布时间】:2015-10-19 09:31:09
【问题描述】:

我想使用 Java 7 的嵌入式 javascript 引擎运行 javascript。我尝试运行的代码符合 ECMAScript 5,这应该不是问题,因为嵌入式 Rhino 的版本是支持它的 1.7 release 3。但是,运行以下 sn-p 不起作用:

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");
    engine.eval("var char = 'a';");

失败并出现错误missing variable name,这表明char 是保留关键字。但是,char 在 ECMAScript 5 中不再保留,所以我完全糊涂了。问题是哪个 javascript 版本应该与 java 7 中的嵌入式 Rhino 一起使用?

我用的是java1.7.0_80,引擎上报的语言版本是1.8,引擎版本是1.7 release 3 PRERELEASE

【问题讨论】:

  • 该脚本在 Java 7(OpenJDK、Linux)中对我来说不会失败。它工作得很好。
  • @RealSkeptic 确实,OpenJDK 似乎包含 Rhino 1.7 r4。由于我无法迁移到 OpenJDK,我将尝试使用 Rhino 1.7 r4 作为外部 jar。无论如何,感谢您发现这一点。

标签: javascript java java-7 ecmascript-5


【解决方案1】:

正如@RealSkeptic 所指出的,OpenJDK 7 (Rhino 1.7 r4) 的嵌入式脚本引擎运行上述javascript sn-p 没有问题。 Rhino 1.7 r3好像不能运行,所以使用Oracle Java 7运行需要1.7 r4(或以上)的外部Rhino,可以从here下载。为了完整起见,问题中基于 Rhino 自己的 API 的代码的 java 等效项如下所示:

import org.mozilla.javascript.Context;
import org.mozilla.javascript.ScriptableObject;

public class Rhino {

    public static void main(String[] args) throws Exception {
        Context context = Context.enter();
        try {
            ScriptableObject scope = context.initStandardObjects();
            context.evaluateString(scope, "var char = 'a'", "test", 1, null);
        } finally {
             Context.exit();
        }
   }

}

请注意,导入声明很重要,因为相同的类可以捆绑在不同包中的 JDK 中:

import sun.org.mozilla.javascript.internal.Context;
import sun.org.mozilla.javascript.internal.ScriptableObject;

导入它们会导致将嵌入式引擎与 Rhino 的 API 一起使用,这将不起作用。

【讨论】:

    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2012-06-12
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多