readFully 未使用 Java Nashorn Javascript 引擎定义
readFully not defined with Java Nashorn Javascript Engine
我正在尝试使用新的 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);");
}
}
此示例打印嘿!然后是 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 方法并将其与脚本上下文绑定,但我更愿意理解为什么它不起作用并使用已经内置的函数。
此致
readFully 不是标准的 JavaScript 函数,它在 Nashorn 中也可能不是标准的。
有similar issues when Rhino was chosen for inclusion in the Sun implementation of Java 6. The scripting tool may provide enhancements that are not present in the embedded API. readFully is not a documented function in the Java 8 Nashorn API.
在 Java 的早期版本中,规范声明提供的脚本引擎是 JRE 供应商的实现细节。我不知道 Java 8 是否强制提供了有关引擎的任何内容,或者它是否提供了任何未来的兼容性保证。如果这可能是个问题,我会彻底检查 JSR-337。
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions
readFully(仅限脚本模式)
此函数读取作为字符串参数传入的文件的全部内容并将其发送到标准输出,或者您可以将结果分配给变量。
readFully 示例:
jjs> readFully("text.txt")
This is the contents of the text.txt file located in the current working directory.
最后,我实现了我在脚本中使用的 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 仅在脚本模式下启用。 Nashorn docs
试试这个:
>>jjs -scripting
jjs> readFully("your_file")
当您在应用程序中启用脚本时,readFully() 函数仅作为 nashorgn 中的内置函数可用
您可以通过两种方式执行此操作:-
- 当您 运行 您的应用程序启用 nashorn 时,传递
-Dnashorn.args=-scripting
脚本
- 通过使用脚本参数创建 Nashorn 引擎以编程方式启用它
<code>NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine(new String[] { "-scripting" });
我正在尝试使用新的 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);");
}
}
此示例打印嘿!然后是 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 方法并将其与脚本上下文绑定,但我更愿意理解为什么它不起作用并使用已经内置的函数。
此致
readFully 不是标准的 JavaScript 函数,它在 Nashorn 中也可能不是标准的。
有similar issues when Rhino was chosen for inclusion in the Sun implementation of Java 6. The scripting tool may provide enhancements that are not present in the embedded API. readFully is not a documented function in the Java 8 Nashorn API.
在 Java 的早期版本中,规范声明提供的脚本引擎是 JRE 供应商的实现细节。我不知道 Java 8 是否强制提供了有关引擎的任何内容,或者它是否提供了任何未来的兼容性保证。如果这可能是个问题,我会彻底检查 JSR-337。
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions
readFully(仅限脚本模式)
此函数读取作为字符串参数传入的文件的全部内容并将其发送到标准输出,或者您可以将结果分配给变量。
readFully 示例:
jjs> readFully("text.txt")
This is the contents of the text.txt file located in the current working directory.
最后,我实现了我在脚本中使用的 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 仅在脚本模式下启用。 Nashorn docs
试试这个:
>>jjs -scripting
jjs> readFully("your_file")
当您在应用程序中启用脚本时,readFully() 函数仅作为 nashorgn 中的内置函数可用 您可以通过两种方式执行此操作:-
- 当您 运行 您的应用程序启用 nashorn 时,传递
-Dnashorn.args=-scripting
脚本 - 通过使用脚本参数创建 Nashorn 引擎以编程方式启用它
<code>NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine(new String[] { "-scripting" });