为什么Java Nashorn __DIR__, __LINE__和__FILE__为空

Why Java Nashorn __DIR__, __LINE__ and __FILE__ are null?

本文关键字:FILE 为空 LINE DIR Java Nashorn 为什么      更新时间:2023-09-26

我试图获得__DIR__, __LINE____FILE__ 纳什orn全局在JavaScript文件中,由Java纳什orn引擎(JDK 8)编译和评估。

但是,它们都返回NULL

它们是否与某些特定的Nashorn配置有关?文档中没有提到任何额外的配置来使它们工作

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

事实上,你可以很容易地有__FILE__, __DIR__,和__LINE__工作,如果不做通常:

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,其中这是在全局数组中设置的