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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With