While using Nashorn from Java 8 in the context of a Java based web server for which I authored a tag library for scripting engines, I noted that "arguments" does not get set to the arguments passed via the engine ScriptContext [1] entry ScriptEngine.ARGV [2] (i.e. "javax.script.argv" a single dimensioned Java array of type Object of positional arguments) when invoking the Nashorn script via engine.eval(script).
Is this really to be expected? If so, how can I cause the Nashorn engine to supply the Java arguments to the script or have the script fetch the supplied arguments in a different way? To illustrate, this is an example of three Nashorn fragments in a single JSP (one 'script' element with type 'nashorn', one 'expr' element with type 'javascript' and a 'script' element with type 'javascript'): <%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> <%@ taglib uri="/WEB-INF/script-jsr223.tld" prefix="s" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <style> body { background-color: ivory; } </style> <title>Sample Application JSP Page Using JavaScript Via JSR-223 (Title)</title> </head> <body> <div style="float: left; padding: 10px;"> <img src="images/Unofficial_JavaScript_logo_2.png" alt="" /> </div> <h1>Sample Application JSP Page Using JavaScript Via Script (JSR223)</h1> This is the output of a JSP page that is part of the Hello, World application. <p>Here is the text partially generated by a simple JavaScript script: <br /> <!-- note: a script can be of any size and complexity --> *<s:script type="nashorn">****print("<p>Hello, world, this is Nashorn (JavaScript) speaking at ", Date(), "</p>")****print("<p>arguments: ", arguments, "</p>")****</s:script>* <p>Here is the text generated by a simple JavaScript expression: <br /> <!-- note: an expression only creates a value that is automatically fetched --> <p>It is now exactly *<s:expr type="javascript">Date()</s:expr>*.</p> <p>The following script includes a syntax error (division by zero) intentionally. The error in the script will not inhibit the creation of the page.</p> <!-- note: by default an error in a script will not inhibit the creation of the page --> *<s:script type="javascript">****print('cause a Nashorn/JavaScript error ...')****throw Error("This error is just for testing how the host behaves ...")****</s:script>* <p>Done.<p> </body> </html> The resulting HTML text will show "arguments: " but no arguments going with it, although there are three arguments supplied via the engine scope ScriptContext with the entry ScriptEngine.ARGV as mentioned above. Here the resulting HTML text from the JSP above: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <style> body { background-color: ivory; } </style> <title>Sample Application JSP Page Using JavaScript Via JSR-223 (Title)</title> </head> <body> <div style="float: left; padding: 10px;"> <img src="images/Unofficial_JavaScript_logo_2.png" alt="" /> </div> <h1>Sample Application JSP Page Using JavaScript Via Script (JSR223)</h1> This is the output of a JSP page that is part of the Hello, World application. <p>Here is the text partially generated by a simple JavaScript script: <br /> <!-- note: a script can be of any size and complexity --> <p>Hello, world, this is Nashorn (JavaScript) speaking at Thu Feb 25 2021 16:30:38 GMT+0100 (CET) </p> <p>arguments: </p> <p>Here is the text generated by a simple JavaScript expression: <br /> <!-- note: an expression only creates a value that is automatically fetched --> <p>It is now exactly Thu Feb 25 2021 16:30:38 GMT+0100 (CET).</p> <p>The following script includes a syntax error (division by zero) intentionally. The error in the script will not inhibit the creation of the page.</p> <!-- note: by default an error in a script will not inhibit the creation of the page --> cause a Nashorn/JavaScript error ... <p>Done.<p> </body> </html> ---rony [1] "Java Scripting Framework (JSR-223)": <https://docs.oracle.com/javase/8/docs/api/index.html?javax/script/package-summary.html> [2] "javax.script.ScriptContext": <https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptContext.html> [3] "javax.script.ScriptEngine": <https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngine.html> [4] "Nashorn and Shell Scripting": <https://docs.oracle.com/javase/10/nashorn/nashorn-and-shell-scripting.htm#JSNUG158> P.S.: It seems from samples on the Internet that when using the shell to invoke Nashorn that the arguments get passed on to the script [4].