Search code examples
javajavascriptbashjava-8nashorn

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.


Solution

  • 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.