2015-01-05 12 views
6

Sto cercando di eseguire uno script javascript con il nuovo Java 8 Nashorn motore JavaScript, ma non riesce con il seguente errore:readFully non definita con Java Nashorn JavaScript Engine

<eval>:1 ReferenceError: "readFully" is not defined 

Lo script utilizza la funzione readFully che dovrebbe essere definito nell'ambito globale nashorn viene eseguito con la modalità di scripting abilitata (che è predefinita quando si esegue uno ScriptEngine come si vede qui http://mail.openjdk.java.net/pipermail/nashorn-dev/2013-December/002562.html).

Ecco un esempio per riprodurre l'errore:

import java.io.FileNotFoundException; 

import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptException; 

public class Test { 

    public static void main(String[] argv) throws FileNotFoundException, ScriptException { 
     ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("nashorn"); 

     scriptEngine.eval("print('Hey!');print(print);print(readFully);"); 


    } 
} 

Questo campione stampe Hey! e quindi il codice sorgente della funzione di stampa (un'altra funzione incorporata di nashorn) e infine dovrebbe stampare il codice sorgente del metodo readFully. Ma ho questa eccezione invece:

Exception in thread "main" javax.script.ScriptException: ReferenceError: "readFully" is not defined in <eval> at line number 1 
    at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:586) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:570) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:525) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:521) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:192) 
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264) 
    at com.github.bringking.maven.requirejs.Test.main(Test.java:14) 
Caused by: <eval>:1 ReferenceError: "readFully" is not defined 
    at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:58) 
    at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:320) 
    at jdk.nashorn.internal.runtime.ECMAErrors.referenceError(ECMAErrors.java:292) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.__noSuchProperty__(NashornScriptEngine.java:272) 
    at jdk.nashorn.internal.scripts.Script$engine.L:35(nashorn:engine/resources/engine.js:37) 
    at jdk.nashorn.internal.scripts.Script$\^eval\_.runScript(<eval>:1) 
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:535) 
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:209) 
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:378) 
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:568) 
    ... 5 more 

Quando lo script di esempio viene eseguito con la riga di comando con il parametro Nashorn -scripting (con lo strumento jjs del JDK), tutto va bene. Ecco il risultato dello stesso copione:

Hey! 
function print() { [native code] } 
function readFully() { [native code] } 

ho potuto riscrivere un metodo readFully e associarlo con il contesto sceneggiatura, ma io preferisco di capire il motivo per cui non funziona e utilizzare le funzioni già integrate.

saluti

+0

Cosa JDK stai usando? Oracle o OpenJDK? –

+0

Orcale JDK su Windows 7: versione java "1.8.0_25", Java (TM) SE Runtime Environment (build 1.8.0_25-b18), Java HotSpot (TM) Client VM (build 25.25-b02, modalità mista) – Stratehm

+0

Il blog post che hai collegato a re: openjdk. Sono ancora un po 'diversi. –

risposta

4

Infine, ho implementato una funzione di readFully che uso nel mio script (Compatibile solo con Nashorn):

function readFully(url) { 
    var result = ""; 
    var imports = new JavaImporter(java.net, java.lang, java.io); 

    with (imports) { 

     var urlObj = null; 

     try { 
      urlObj = new URL(url); 
     } catch (e) { 
      // If the URL cannot be built, assume it is a file path. 
      urlObj = new URL(new File(url).toURI().toURL()); 
     } 

     var reader = new BufferedReader(new InputStreamReader(urlObj.openStream())); 

     var line = reader.readLine(); 
     while (line != null) { 
      result += line + "\n"; 
      line = reader.readLine(); 
     } 

     reader.close(); 
    } 

    return result; 
} 
2

readFully non è una funzione JavaScript standard e non è probabile standard Nashorn neanche.

Ci sono stati similar issues quando Rhino è stato scelto per l'inclusione nell'implementazione Sun di Java 6. Lo strumento di scripting può fornire miglioramenti non presenti nell'API incorporato. readFully non è una funzione documentata nello Java 8 Nashorn API.

Nelle versioni precedenti di Java la specifica indicava che i motori di scripting forniti erano un dettaglio di implementazione del fornitore JRE. Non sono a conoscenza se Java 8 rende nulla sui motori forniti obbligatori o se garantisce future garanzie di compatibilità. Vorrei verificare a fondo il JSR-337 se questo potrebbe essere un problema.

+0

Grazie per le informazioni. Implementerò una funzione readFully da solo. – Stratehm

1

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions

readFully (modalità -scripting solo)

Questa funzione legge l'intero contenuto di un file passato come un argomento di stringa e lo invia a stdout, oppure si può assegnare il risultato a una variabile .

readFully esempio:

jjs> readFully("text.txt") This is the contents of the text.txt file located in the current working directory.

+0

Il mio problema è che readFully non è definito quando si esegue l'API ScriptEngine. Non con l'eseguibile jjs (in questo modo, va tutto bene). – Stratehm

+1

È possibile passare opzioni a Nashorn utilizzando l'interfaccia diretta nashorn NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); String [] options = new String [] {"-scripting"}; NashornScript Engine engine = factory.getScriptEngine (opzioni); o semplicemente metti un '#' come primo carattere della sceneggiatura. – wickund

0

readFully è abilitata solo in scripting modalità.Nashorn docs

provare questo:

>>jjs -scripting 
jjs> readFully("your_file")