Providing "script name" to eval

A. Sundararajan sundararajan.athijegannathan at oracle.com
Thu Jul 10 03:16:06 UTC 2014


Hi,

You can file name using ScriptEngine.FILENAME 
(http://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngine.html) property 
to associate script "file" name with a eval-ed script.

import javax.script.*;

public class Main {
   public static void main(String[] args) throws Exception {
       ScriptEngineManager m = new ScriptEngineManager();
       ScriptEngine e = m.getEngineByName("nashorn");
       e.put(ScriptEngine.FILENAME, "file.js");
       e.eval("foo");
   }
}

With that Nashorn will associate provided scriptName for that script. 
You can use "load" function as well to load a named script from a script 
object.

import javax.script.*;

public class Main {
   public static void main(String[] args) throws Exception {
       ScriptEngineManager m = new ScriptEngineManager();
       ScriptEngine e = m.getEngineByName("nashorn");
       e.put("scriptName", "file.js");
       e.put("script", "foo");
       e.eval("load({ script: script, name: scriptName })");
   }
}

  You can also use "eval naming" (See 
http://bugs.java.com/view_bug.do?bug_id=8032068) with jdk8u20+ and the 
example below:

import javax.script.*;

public class Main {
   public static void main(String[] args) throws Exception {
       ScriptEngineManager m = new ScriptEngineManager();
       ScriptEngine e = m.getEngineByName("nashorn");
       // older form of the directive //@ sourceURL works too.
       e.eval("//# sourceURL=myscript.js\nfoo");
   }
}

Hope this helps.
-Sundar

On Wednesday 09 July 2014 08:32 PM, Tim Fox wrote:
> Hi folks,
>
> I am using Nashorn to execute a piece of JavaScript using eval:
>
> String str = loadFileFromClasspath(scriptName);
>
> engine.eval(str);
>
> If there's an error in the script, I get an error message something 
> like this:
>
> ReferenceError: "blah" is not defined in <eval> at line number 1245242
>
> Is there any way informing the engine of the "script name" when 
> running the eval so it provides nicer error messages like this:
>
> ReferenceError: "blah" is not defined in myscript.js at line number 
> 1245242
>
> Which is much nicer for the user.
>
> (As a last resort I can catch any exceptions and replace <eval> with 
> scriptName then rethrow them, but it would be nice if the engine could 
> do this for me)
>
>



More information about the nashorn-dev mailing list