javax.script.ScriptException bei der ScriptEngine

pkm

Bekanntes Mitglied
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:

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?
 
Nein, steht er nicht.


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:
[...]
Wieso ist println denn nicht definiert?
println gibt es in Javascript so nicht, wenn du System.out.println dafür nutzen willst, solltest du es auch so hinschreiben ( oder die Variante aus dem Beispiel nutzen)
 
Ich habe es nun getestet. Ohne ln funktioniert es.

Java-Code:
Java:
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("test.js")));
       } catch (FileNotFoundException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (ScriptException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
   }

}
Inhalt von C:\Users\Erich\Desktop\Schule\eclipse_java_mars\workspace\Test_121_Programm_fuer_pkm\test.js:
Code:
print("This is hello from test.js");

Es wird ausgegeben:
Code:
This is hello from test.js
null
 
Zuletzt bearbeitet:

Zurück
Oben