为什么Java Nashorn __DIR __,_ _ _ 3和__FILE__为空?

时间:2014-07-09 07:31:00

标签: java javascript java-8 scriptengine nashorn

我想在JavaScript文件中获取__DIR____LINE____FILE__ Nashorn全局,这是由Java Nashorn Engine(JDK 8)编译和评估的

然而,所有这些都返回 NULL ...

它们与某些特定的Nashorn配置有关吗?它没有在documentation中说任何有关使其工作的任何其他配置的内容。

2 个答案:

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