Я использовал следующий код двигателя Rhino
JavaScript в Java:переменного Доступ ScriptContext использования Насхорн JavaScript Engine (Java 8)
@Test
public void testRhino() throws ScriptException {
final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName("rhino");
final String raw = "I am the raw value injected";
final ScriptContext ctx = new SimpleScriptContext();
ctx.setAttribute("raw", raw, ScriptContext.ENGINE_SCOPE);
String script = "var result = 'I am a result';";
script += "java.lang.System.out.println(raw);";
script += "'I am a returned value';";
final Object res = engine.eval(script, ctx);
System.out.println(ctx.getAttribute("result"));
System.out.println(res);
}
Выход сценария (с использованием Rhino
) является:
I am the raw value injected
I am a result
I am a returned value
в двигателе Nashorn
JavaScript, я не получаю никакого значения для result
:
@Test
public void testNashorn() throws ScriptException {
final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName("nashorn");
final String raw = "I am the raw value injected";
final ScriptContext ctx = new SimpleScriptContext();
ctx.setAttribute("raw", raw, ScriptContext.ENGINE_SCOPE);
String script = "var result = 'I am a result';";
script += "java.lang.System.out.println(raw);";
script += "'I am a returned value';";
final Object res = engine.eval(script, ctx);
System.out.println(ctx.getAttribute("result"));
System.out.println(res);
}
возвращает
I am the raw value injected
null
I am a returned value
Как я могу получить доступ значение result
переменной ScriptContext
с помощью nashorn
двигателя?
'NashornScriptEngine # createBindings()' возвращает либо новый SimpleBindings() ', если установлен параметр global-per-engine, либо' createGlobalMirror() ', если он не установлен. Запуск с помощью '-Dnashorn.args = - global-per-engine' или добавление строки' System.setProperty («nashorn.args», «-global-per-engine»); 'перед созданием движка , вызовут 'ctx.getAttribute (" result ")', чтобы снова возвратить 'null'. Работа над глобальным Nashorn является одной из самых больших проблем в внедрении Nashorn в Java-приложении. – AJNeufeld