我正在尝试在由 Java Nashorn Engine (JDK 8) 编译和评估的 JavaScript 文件中获取__DIR__
,__LINE__
和__FILE__
Nashorn 全局变量。
但是,它们都返回NULL ...
它们是否与某些特定的 Nashorn 配置有关?它没有在文档中说明任何其他配置以使它们正常工作。
我正在尝试在由 Java Nashorn Engine (JDK 8) 编译和评估的 JavaScript 文件中获取__DIR__
,__LINE__
和__FILE__
Nashorn 全局变量。
但是,它们都返回NULL ...
它们是否与某些特定的 Nashorn 配置有关?它没有在文档中说明任何其他配置以使它们正常工作。
我知道这是一个老问题,但是当我想出一个简单的解决方案时,我想分享它来帮助面临同样问题的人。
事实上,你可以很容易地拥有__FILE__
,__DIR__
和__LINE__
work if 而不是像往常一样:
engine.eval(new FileReader("path_to_your_js"));
您实际上调用了一个小的 JS 代码来加载您的文件:
engine.eval("load('path_to_your_js')");
这是因为您可能将脚本作为字符串加载。大多数例子是这样的:
engine.eval(new FileReader("scripts/hello.js"));
然后引擎不知道这个脚本来自哪里,因为它只从 FileReader 获取响应。就像调用一样engine.eval("print('hello')")
,没有文件,只有一个字符串。
如果您从控制台调用脚本,使用jjs
,它们会正确填充。
为了从 Java 中实现这一点,我目前只看到一个肮脏的:将文件路径保存为上下文中的字符串并从 js 访问它:
ScriptContext ctx = engine.getContext();
ctx.getBindings(ScriptContext.GLOBAL_SCOPE).put("thisFile", script);
engine.eval(new FileReader(script), defCtx);
js:
print("I am " + thisFile);
输出:
I am resources/test.js
注意:但这必须是可能的,因为jdk.nashorn.tools.Shell
能够设置一个jdk.nashorn.internal.runtime.Context
在全局数组中设置的位置。