【问题标题】:Why Java Nashorn __DIR__, __LINE__ and __FILE__ are null?为什么 Java Nashorn __DIR__、__LINE__ 和 __FILE__ 为空?
【发布时间】:2014-07-09 07:31:00
【问题描述】:

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

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

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

【问题讨论】:

  • 为我工作...您如何调用 Nashorn?注意,如果jjs 正在从标准输入读取,__DIR__ 为空。
  • 我正在使用来自 Java 的 Nashorn。评估CompiledScript 对象。

标签: java javascript java-8 scriptengine nashorn


【解决方案1】:

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

事实上,您可以轻松地让__FILE____DIR____LINE__ 工作,而不是像往常一样:

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

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

engine.eval("load('path_to_your_js')");

【讨论】:

  • 这很有帮助!谢谢你。不过,我还要补充一点,虽然这在我的 Apple Mac 上运行良好,但对于针对 Windows,我发现有必要转义路径名中的反斜杠。即 pathname = pathname.replace("\\", "\\\\"); engine.eval("load(\"" + 路径名 + "\")";
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-02-17
    • 2011-02-14
    • 2013-10-21
    • 1970-01-01
    • 2016-03-23
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多