Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enable scripting mode for nashorn in java

I have to execute some bash shell commands from Java using nashorn.

I have a javascript file:

#!/usr/bin/jjs

var testBashMethod = function(name){

    $EXEC("echo Hello from bash ${name}");
};

testBashMethod("foobar");

I have java method loading the above javascript method into Nashorn engine and executing it:

public void executeScript(){

    ScriptEngineManager engineManager = new ScriptEngineManager();
    ScriptEngine engine = engineManager.getEngineByName("nashorn");

    engine.eval(new FileReader("script.js"));

    Invocable invocable = (Invocable)engine;
    invocable.invokeFunction("testBashMethod");
}

On executing the above method I get the following error:

jdk.nashorn.internal.runtime.ECMAException: ReferenceError: "$EXEC" is not defined

My guess is that I need to load the nashorn engine in scripting mode in java. On the terminal I can run the engine with scripting mode then the following executes successfully:

jjs -scripting
jjs> $EXEC('echo Hello World..!!')

My Question: How do I load the nashorn engine in Java in scripting mode? so that bash scripting methods are available. Or is there something else that I am missing.

Thank you for the help.

like image 704
Panshul Avatar asked Nov 11 '14 19:11

Panshul


2 Answers

NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine engine = factory.getEngine(new String[] { "-scripting" });

See the Nashorn Wiki for lots more documentation. I got (and modified) the above snippet from the Nashorn jsr223 engine notes page.

like image 125
David P. Caldwell Avatar answered Sep 25 '22 06:09

David P. Caldwell


You can also define nashorn options via via "nashorn.args" System property as well. So, something like

java -Dnashorn.args=-scripting MyMainClass

will work and your code can stick to javax.script API (need not use jdk.nashorn.api.scripting API). But this implies all engines created by your Java process will have scripting mode enabled.

like image 28
A. Sundararajan Avatar answered Sep 23 '22 06:09

A. Sundararajan