在Java 7上运行符合ECMAScript 5的javascript
我想使用Java7的嵌入式javascript引擎运行javascript。我试图运行的代码是符合ECMAScript 5的,这应该不是问题,因为嵌入式Rhino的版本是支持它的。但是,运行以下代码段不起作用:在Java 7上运行符合ECMAScript 5的javascript,javascript,java,java-7,ecmascript-5,Javascript,Java,Java 7,Ecmascript 5,我想使用Java7的嵌入式javascript引擎运行javascript。我试图运行的代码是符合ECMAScript 5的,这应该不是问题,因为嵌入式Rhino的版本是支持它的。但是,运行以下代码段不起作用: ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); engine.eval("v
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval("var char = 'a';");
它失败,错误为缺少变量名
,这表明char
是保留关键字。但是,ECMAScript 5中不再保留字符
,因此我完全感到困惑。问题是哪个javascript版本应该与Java7中的嵌入式Rhino一起工作
我使用的是java
1.7.0_80
,引擎报告的语言版本是1.8
,引擎版本是1.7 release 3 PRERELEASE
正如@realpoint所指出的,OpenJDK 7的嵌入式脚本引擎(Rhino 1.7 r4
)在运行上述javascript代码段时没有问题。似乎rhino1.7r3
无法运行它,因此使用oraclejava7运行它需要1.7r4
(或更高版本)的外部Rhino,可以从下载。为了完整起见,问题中基于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一起使用,这将不起作用。在Java 7(OpenJDK,Linux)中,该脚本对我来说不会失败。它工作得很好。@realponsign实际上,OpenJDK似乎包含
rhino1.7R4
。因为我不能迁移到OpenJDK,所以我将尝试使用Rhino1.7R4
作为外部jar。无论如何,谢谢你发现了这一点。