Почему Java Nashorn __DIR__, __LINE__ и __FILE__ равны нулю?
Я пытаюсь получить __DIR__
, __LINE__
а также __FILE__
Глобалы Nashorn в файле JavaScript, который компилируется и оценивается Java Nashorn Engine (JDK 8).
Тем не менее, все они возвращают NULL...
Они связаны с какой-то конкретной конфигурацией Nashorn или? В документации ничего не говорится о какой-либо дополнительной конфигурации, чтобы заставить их работать.
2 ответа
Я знаю, что это старый вопрос, но когда я нашел простое решение, я хотел поделиться им, чтобы помочь людям, сталкивающимся с той же проблемой.
На самом деле вы можете легко иметь __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
где это установлено в массиве глобалов.