read完全没有用Java Nashorn Javascript引擎定义
readFully not defined with Java Nashorn Javascript Engine
我正在尝试使用新的Java 8 Nashorn javascript引擎运行javascript脚本,但它失败并出现以下错误:
<eval>:1 ReferenceError: "readFully" is not defined
该脚本使用应在全局作用域中定义的 readFull 函数 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 !,然后打印函数的源代码(另一个 nashorn 内置函数),最后它应该打印 readFull 方法的源代码。但我有这个例外:
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] }
我可以重写一个readFull方法并将其与脚本上下文绑定,但我更愿意理解为什么它不起作用并使用已经内置的函数。
问候
最后,我实现了一个在脚本中使用的readFull函数(仅与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;
}
readFull不是一个标准的JavaScript函数,在Nashorn中也可能不是标准的。
当 Rhino 被选中包含在 Java 6 的 Sun 实现中时,也存在类似的问题。脚本工具可以提供嵌入式 API 中不存在的增强功能。readFull 不是 Java 8 Nashorn API 中记录的函数。
在以前的Java版本中,规范声明提供的脚本引擎是JRE供应商的实现细节。我不知道Java 8是否强制要求提供引擎,或者它是否对未来的兼容性做出了任何保证。如果这可能是一个问题,我会彻底检查 JSR-337。
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions
完全可读(仅限脚本模式)
此函数读取作为字符串参数传入的文件的全部内容,并将其发送到 stdout,或者您可以将结果分配给变量。
阅读完整示例:
jjs> readFully("text.txt")
This is the contents of the text.txt file located in the current working directory.
readFull仅在脚本模式下启用。纳肖恩文档
试试这个:
>>jjs -scripting
jjs> readFully("your_file")
readFull() 函数仅在应用程序中启用脚本时作为 nashorgn 中的内置函数可用有两种方法可以做到这一点:-
- 运行应用程序时传递
-Dnashorn.args=-scripting
以启用 Nashorn脚本 - 通过使用脚本参数
创建 Nashorn 引擎以编程方式启用它
NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine(new String[] { "-scripting" });
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 如何在javascript Nashorn引擎中解析XML
- read完全没有用Java Nashorn Javascript引擎定义
- 在html的javascript文件中使用Nashorn
- 在Java 8 Nashorn JavaScript引擎中同时加载脚本是否有意义
- Nashorn-调试在Nashorn中运行的javascript
- 使用Nashorn将Javascript函数作为函数接口类型传递给Java方法
- Java 8 Nashorn JJS – javascript console
- 在Nashorn中执行javascript时未发现文件异常
- 在多个nashorn脚本引擎之间共享JavaScript数组和对象
- 向Nashorn脚本提供JavaScript日期
- 如何将Javascript原生类型从Java传递给Nashorn对象
- 如何从Nashorn获得JavaScript堆栈跟踪?
- 如何为js/Nashorn javascript指定CLASSPATH
- Nashorn/Rhino将字符串从Java转换为Javascript
- Gradle任务运行Nashorn JavaScript
- 如何在Nashorn的javascript中访问我的类中的方法
- 使用 Nashorn javascript jjs 查找 JMX MBeans
- 在windows上使用javascript (nashorn)编写命令行脚本