readFully没有使用Java Nashorn Javascript Engine定义

我正在尝试使用新的Java 8 Nashorn javascript引擎运行javascript脚本,但它失败并出现以下错误:

: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);"); } } 

这个样本打印嘿! 然后是print函数的源代码(另一个nashorn内置函数),最后它应该打印readFully方法的源代码。 但我有这个例外:

 Exception in thread "main" javax.script.ScriptException: ReferenceError: "readFully" is not defined in  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: :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(: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方法并将其与脚本上下文绑定,但我更喜欢理解为什么它不起作用并使用已经内置的函数。

问候

最后,我实现了一个我在脚本中使用的readFully函数(仅与Nashorn兼容):

 function readFully(url) { var result = ""; var imports = new JavaImporter(java.net, java.lang, java.io); with (imports) { var urlObj = null; try { urlObj = new URL(url); } catch (e) { // If the URL cannot be built, assume it is a file path. urlObj = new URL(new File(url).toURI().toURL()); } var reader = new BufferedReader(new InputStreamReader(urlObj.openStream())); var line = reader.readLine(); while (line != null) { result += line + "\n"; line = reader.readLine(); } reader.close(); } return result; } 

readFully不是标准的JavaScript函数,它也可能不是Nashorn的标准。

当Rhino被选择包含在Java 6的Sun实现中时,存在类似的问题 。脚本工具可能提供嵌入式API中不存在的增强function。 readFully不是Java 8 Nashorn API中的文档化函数。

在以前的Java版本中,规范声明提供的脚本引擎是JRE供应商的实现细节。 我不知道Java 8是否对所提供的引擎有任何强制性要求,或者它是否会提供任何未来的兼容性保证。 如果这可能是一个问题,我会彻底检查JSR-337 。

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions

readFully(仅限脚本模式)

此函数读取作为字符串参数传入的文件的全部内容并将其发送到stdout,或者您可以将结果分配给变量。

readFully示例:

jjs> readFully("text.txt") This is the contents of the text.txt file located in the current working directory.

readFully仅在脚本模式下启用。 Nashorn文档

尝试这个:

 >>jjs -scripting jjs> readFully("your_file")