8

私のコードでは、すべてのスクリプトが.jsファイルに含まれています。スクリプトの1つにエラーが含まれていると、次のようになります。

javax.script.ScriptException:sun.org.mozilla.javascript.internal.EcmaError:ReferenceError:"nonexistant"が定義されていません。(<不明なソース>#5)<不明なソース>の行番号5

私を悩ませているのは<不明なソース>です。1つのScriptContextに複数のファイルが含まれているため、エラーを追跡するのが難しい場合があります。それもひどいように見えます。

<Unknown Source>を実際のファイル名に置き換える方法はありますか?私が見ているメソッドはどれもFileオブジェクトの受け渡しをサポートしていないので、ここでは本当に混乱しています。

4

4 に答える 4

12

ScriptEngine.FILENAME定数を使用します。

scriptEngine.put(ScriptEngine.FILENAME、scriptFile.toString());

于 2010-05-26T23:47:37.010 に答える
6

質問はまだ具体的にはされていませんが、将来このトピックに遭遇した人にはこれを提供したいと思いました。これは、Java 8がリリースされ、Rhinoから基盤となるJavaScriptエンジンとしてNashornに移行するときに変更されます。Nashornでは、ファイル名はScriptEngine自体ではなく、ScriptContextに適用されます。

ScriptContext context = new SimpleScriptContext();
context.setAttribute(ScriptEngine.FILENAME, "test.js", ScriptContext.ENGINE_SCOPE);
try
{
    engine.eval(script, context);
}
catch (ScriptException e)
{
    /* e.getFileName() will return "test.js" */
}

Rhinoで行うように、ScriptEngine.put()を使用してファイル名を適用しようとすると、何も起こらず、例外はファイル名として「<eval>」を返します。

今後数ヶ月でこの問題に遭遇する人もいると思いますので、提供したいと思いました。これはどこにも文書化されていないようです。私はそれを理解するためにNashornのソースコードを掘り下げなければなりませんでした。

于 2014-02-11T20:29:00.613 に答える
3

mattj65816によって計算されたScriptContextを介してスクリプトエンジンのファイル名を設定するJava8(Nashorn)の方法は、Rhinoエンジンでも機能します。だから、私は使用することをお勧めします

context.setAttribute(ScriptEngine.FILENAME, "test.js", ScriptContext.ENGINE_SCOPE);

このコードは両方の一般的なJavaScriptエンジンで機能するためです。イベントで独自のコンテキストを作成する必要はありませんが、属性をエンジンのデフォルトコンテキストに設定するだけです。

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
if (engine != null) {
    ScriptContext ctx = engine.getContext();
    ctx.setAttribute(ScriptEngine.FILENAME, "test.js", ScriptContext.ENGINE_SCOPE);
    ...
}
于 2014-07-03T17:01:12.600 に答える
0

完全!

    ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
    // javax.script.filename
    engine.put(ScriptEngine.FILENAME, "test1.js");
    try {
        engine.eval("function throwError1(){throw new Error('test, haha')}");
    } catch (ScriptException e) {
    }       

    engine.put(ScriptEngine.FILENAME, "test2.js");
    try {
        engine.eval("function throwError2(){throw new Error('test2, haha')}");
    } catch (ScriptException e) {
    }
    try {
        engine.eval("throwError1()");
    } catch (ScriptException e) {
        System.out.println(e.getMessage());
    }
    try {
        engine.eval("throwError2()");
    } catch (ScriptException e) {
        System.out.println(e.getMessage());
    }

出力:

Error: test, haha in test1.js at line number 1
Error: test2, haha in test2.js at line number 1
于 2013-12-06T02:54:30.037 に答える