Enable scripting mode for nashorn in java

2.7k Views Asked by At

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.

2

There are 2 best solutions below

0
On BEST ANSWER
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.

1
On

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.