我想在JavaScript文件中获取__DIR__
,__LINE__
和__FILE__
Nashorn全局,这是由Java Nashorn Engine(JDK 8)编译和评估的
然而,所有这些都返回 NULL ...
它们与某些特定的Nashorn配置有关吗?它没有在documentation中说任何有关使其工作的任何其他配置的内容。
答案 0 :(得分:3)
我知道这是一个老问题,但是当我提出一个简单的解决方案时,我想分享它以帮助那些面临同样问题的人。
事实上,如果不是通常的话,您可以轻松地__FILE__
,__DIR__
和__LINE__
工作:
engine.eval(new FileReader("path_to_your_js"));
你实际上调用了一个加载文件的小JS代码:
engine.eval("load('path_to_your_js')");
答案 1 :(得分:1)
这是因为您可能将脚本作为String加载。大多数例子是这样的:
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
,其中这是在全局数组中设置的。