Почему 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 где это установлено в массиве глобалов.

Другие вопросы по тегам