Ich wollte die einfache Auswertung von JavaScript-Funktionen mit der ScriptEngine üben; dies wollte ich erreichen, indem ich eine .js-Datei auslesen wollte. Dabei habe ich mich an der Dokumentation orientiert:
https://docs.oracle.com/javase/7/docs/technotes/guides/scripting/programmer_guide/
..in welcher es heißt:
Ich habe also ein einfaches Programm in eclipse geschrieben, welches eine JS-Datei auslesen soll. Das Programm sieht wie folgt aus:
Meine JS-Datei kann er auch finden, diese enthält nur eine Zeile Code:
Wenn ich das Programm ausführe, bekomme ich dennoch eine Exception, und ich habe keine Ahnung, woher diese rührt:
Wieso ist println denn nicht definiert?
https://docs.oracle.com/javase/7/docs/technotes/guides/scripting/programmer_guide/
..in welcher es heißt:
Evaluating a Script File
In this example, we call the eval method that accepts java.io.Reader for the input source. The script read by the given reader is executed. This way it is possible to execute scripts from files, URLs and resources by wrapping the relevant input stream objects as readers.
Code:import javax.script.*; public class EvalFile { public static void main(String[] args) throws Exception { // create a script engine manager ScriptEngineManager factory = new ScriptEngineManager(); // create JavaScript engine ScriptEngine engine = factory.getEngineByName("JavaScript"); // evaluate JavaScript code from given file - specified by first argument engine.eval(new java.io.FileReader(args[0])); } }
Let us assume that we have the file named "test.js" with the following text:
println("This is hello from test.js");
We can run the above Java as
java EvalFile test.js
Ich habe also ein einfaches Programm in eclipse geschrieben, welches eine JS-Datei auslesen soll. Das Programm sieht wie folgt aus:
Code:
import java.io.FileNotFoundException;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class MainMethod {
public static void main(String[] args) {
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
// evaluate JavaScript code from given file - specified by first argument
try {
System.out.println(engine.eval(new java.io.FileReader("/home/user/workspace/Test/src/faculty.js")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Meine JS-Datei kann er auch finden, diese enthält nur eine Zeile Code:
Code:
println("This is hello from test.js");
Wenn ich das Programm ausführe, bekomme ich dennoch eine Exception, und ich habe keine Ahnung, woher diese rührt:
javax.script.ScriptException: ReferenceError: "println" is not defined in <eval> at line number 1
at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:454)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:406)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402)
at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:150)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
Wieso ist println denn nicht definiert?