Search code examples
javanashorn

Redirect Nashorn stdout and stderror


Trying to redirect the Nashorn scripting engine from within a Java class. This is how I'm initializing it right now. I'd like to redirect any output from the scripts the engine runs.

String[] nashornArgs = new String[] {"-strict", "--no-java",
                "--no-syntax-extensions", "-dump-on-error"};
NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ScriptEngine engine = factory.getScriptEngine(nashornArgs);

I know Nashorn has the following args (below) but I'm not sure how to initialize correctly and in a manner where any output is discarded by the program. Maybe create a temp file and then delete the temp file once the engine is done? Seems messy to me.


--stderr (Redirect stderr to a filename or to another tty, e.g. stdout)

param: output console

--stdout (Redirect stdout to a filename or to another tty, e.g. stderr)

param: output console


Solution

  • You can redirect output like this:

    package com.example;
    
    import java.io.StringWriter;
    
    import javax.script.ScriptContext;
    import javax.script.ScriptEngine;
    import javax.script.ScriptException;
    
    import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
    
    public class Nashorn {
        public static void main(String[] args) throws ScriptException {
            String[] arguments = new String[] {"-strict", "--no-java", "--no-syntax-extensions", "-dump-on-error"};
            NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
            ScriptEngine engine = factory.getScriptEngine(arguments);
            StringWriter sw = new StringWriter();
            ScriptContext context = engine.getContext();
            context.setWriter(sw);
            context.setErrorWriter(sw);
            engine.eval("print('hello world')");
            System.out.println("redirected output: " + sw);
        }
    }