5

我正在尝试在由 Java Nashorn Engine (JDK 8) 编译和评估的 JavaScript 文件中获取__DIR__,__LINE____FILE__ Nashorn 全局变量。

但是,它们都返回NULL ...

它们是否与某些特定的 Nashorn 配置有关?它没有在文档中说明任何其他配置以使它们正常工作。

4

2 回答 2

4

我知道这是一个老问题,但是当我想出一个简单的解决方案时,我想分享它来帮助面临同样问题的人。

事实上,你可以很容易地拥有__FILE__,__DIR____LINE__work if 而不是像往常一样:

engine.eval(new FileReader("path_to_your_js"));

您实际上调用了一个小的 JS 代码来加载您的文件:

engine.eval("load('path_to_your_js')");
于 2018-05-18T22:06:03.093 回答
1

这是因为您可能将脚本作为字符串加载。大多数例子是这样的:

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在全局数组中设置的位置。

于 2015-03-05T09:36:39.267 回答