2015-01-05 6 views
6

私は、新しいJava 8 NashornではJavaScriptエンジンをJavaScriptのスクリプトを実行しようとしていますが、それは次のエラーで失敗します。のreadFully JavaのNashornのJavascriptエンジンで定義されていない

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

スクリプトがすべきのreadFully機能を使用していますグローバルスコープ内で定義することができます。nashornはスクリプトモードを有効にして実行されます(ここではhttp://mail.openjdk.java.net/pipermail/nashorn-dev/2013-December/002562.htmlのようにScriptEngineを実行しているときにデフォルトになっています)。ここで

は、エラーを再現するためのサンプルです:

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);"); 


    } 
} 

このサンプルプリントがねえ! print関数のソースコード(別のナショーン組み込み関数)を呼び出し、最後にreadFullyメソッドのソースコードを出力します。しかし、私は代わりに、この例外があります:サンプルスクリプトは、(JDKのJJSツールを使用して)-scriptingパラメータとnashornコマンドラインで実行すると

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 

、すべての罰金です。ここでは同じスクリプトの結果である:

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

私はreadFullyメソッドを書き換えて、スクリプトのコンテキストでそれを結合することができるが、私はそれが動作すると、すでに組み込み関数を使用していない理由を理解することを好みます。

よろしく

+0

あなたは何JDKを使用していますか? OracleまたはOpenJDK? –

+0

Windows 7のOrcale JDK:Javaバージョン「1.8.0_25」、Java(TM)SEランタイム環境(ビルド1.8.0_25-b18)、Java HotSpot(TM)クライアントVM(ビルド25.25-b02、混合モード) – Stratehm

+0

ブログあなたがリンクした投稿はre:openjdkです。彼らはまだ少し違います。 –

答えて

4

は、私が(Nashornとのみ互換性を)私のスクリプトで使用のreadFully機能を実装しましたモード。Nashorn docs

はこれを試してみてください。

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

のreadFullyは、標準のJavaScript関数ではありません、それはどちらかの可能性がNashornでは標準ではありません。

RhinoをSunのJava 6実装に含めると、similar issuesがありました。スクリプトツールは、埋め込みAPIにはない拡張機能を提供する可能性があります。 readFullyは、Java 8 Nashorn APIの文書化された機能ではありません。

Javaの以前のバージョンでは、提供されたスクリプトエンジンはJREベンダーの実装の詳細でした。私は、Java 8が必須のエンジンについて何かを作るかどうか、あるいは将来互換性の保証を行うかどうかは分かりません。これが問題になる可能性がある場合は、JSR-337を完全にチェックします。

+0

情報ありがとうございます。私は自分でreadFully関数を実装します。 – Stratehm

1

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

のreadFully(のみ-scriptingモード)

この関数は、文字列引数として渡されたファイルの内容全体を読み込み、標準出力に送信するか、結果を変数に割り当てることができます。

のreadFully例:

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; 
} 
+0

私の問題は、ScriptEngine APIを実行しているときにreadFullyが定義されていないことです。 jjs実行可能ファイルではありません(この方法で、すべて正常です)。 – Stratehm

+1

ダイレクトナショーンインターフェイスを使用してNashornにオプションを渡すことができます。 NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); String [] options = new String [] {"-scripting"}; NashornScriptEngineエンジン= factory.getScriptEngine(オプション); を入力するか、スクリプトの最初の文字に「#」を付けるだけです。 – wickund

0

のreadFullyだけのスクリプトで有効になっている:最後に

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

関連する問題