【发布时间】:2015-03-03 12:17:03
【问题描述】:
我正在尝试使用新的 Java 8 Nashorn javascript 引擎运行 javascript 脚本,但它失败并出现以下错误:
<eval>:1 ReferenceError: "readFully" is not defined
该脚本使用应该在全局范围内定义的 readFully 函数 nashorn 在启用脚本模式的情况下运行(这是通过 ScriptEngine 运行时的默认设置,如此处 http://mail.openjdk.java.net/pipermail/nashorn-dev/2013-December/002562.html 所示)。
这是一个重现错误的示例:
import java.io.FileNotFoundException;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Test {
public static void main(String[] argv) throws FileNotFoundException, ScriptException {
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("nashorn");
scriptEngine.eval("print('Hey!');print(print);print(readFully);");
}
}
此示例打印 Hey !然后是 print 函数的源代码(另一个 nashorn 内置函数),最后它应该打印 readFully 方法的源代码。但我有这个例外:
Exception in thread "main" javax.script.ScriptException: ReferenceError: "readFully" is not defined in <eval> at line number 1
at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:586)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:570)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:525)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:521)
at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:192)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
at com.github.bringking.maven.requirejs.Test.main(Test.java:14)
Caused by: <eval>:1 ReferenceError: "readFully" is not defined
at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:58)
at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:320)
at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:292)
at jdk.nashorn.api.scripting.NashornScriptEngine.__noSuchProperty__(NashornScriptEngine.java:272)
at jdk.nashorn.internal.scripts.Script$engine.L:35(nashorn:engine/resources/engine.js:37)
at jdk.nashorn.internal.scripts.Script$\^eval\_.runScript(<eval>:1)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:535)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:209)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:378)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:568)
... 5 more
当示例脚本使用带有 -scripting 参数的 nashorn 命令行运行时(使用 jdk 的 jjs 工具),一切都很好。这是同一脚本的结果:
Hey!
function print() { [native code] }
function readFully() { [native code] }
我可以重写一个 readFully 方法并将其与脚本上下文绑定,但我更愿意了解它为什么不起作用并使用已经内置的函数。
问候
【问题讨论】:
-
您使用的是什么 JDK? Oracle 还是 OpenJDK?
-
Windows 7 上的 Orcale JDK:java 版本“1.8.0_25”,Java(TM) SE 运行时环境(构建 1.8.0_25-b18),Java HotSpot(TM) 客户端 VM(构建 25.25-b02 , 混合模式)
-
您链接到的博文是 re: openjdk。它们仍然有些不同。
-
确实如此。 1分。所以,现在我正在寻找一种以编程方式“强制”Nashorn 脚本模式的方法 :)
-
不确定。但是你的引擎应该是
javascript(不是nashorn)---如果他们在Java 9中重命名它呢?
标签: java javascript nashorn