3

Javaで実行されているRhino Engineによって評価されている別のスクリプト「Foo」内からスクリプト「Bar」を含めるにはどうすればよいでしょうか。

IE で、Java で次のようにスクリプト エンジンをセットアップします。

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
BufferedReader br = new BufferedReader(new FileReader(new File("Foo.js")));
engine.eval(br);

...そしてFooに以下を入れます:

load(["Bar.js"])

Rhino shell documentationによると、それがその方法です。しかし、Java から実行する場合は、明らかに実装されていません。

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "load" is not defined.

@フィリップ:

クリエイティブな回答ありがとうございます。Invocable インターフェイスが使用されない限り、 eval は解析された関数を利用可能にしないため、そのままのソリューションはうまく機能しません。さらに、Java コードにアクセスできない場合は機能しません。私はあなたの回避策を詳しく説明し、純粋な JS で動作するものを作成しました。

最初にエンジンを作成し、Invocable インターフェースを公開します。

var engine = new Packages.javax.script.ScriptEngineManager().getEngineByName("javascript");
engine = Packages.javax.script.Invocable(engine);

次に、スクリプトを「load()」します

engine.eval(new java.io.FileReader('./function.js'));

この時点で、関数は次のように評価できます。

engine.invokeFunction("printHello", null);
4

1 に答える 1

5

エンジンをそれ自体に渡し、Javascript コード内で eval() を呼び出すことで、なんとかそれを行うことができました。

Java コード:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.put("engine", engine);
engine.eval(new FileReader("test.js"));

test.js:

engine.eval(new java.io.FileReader('function.js'));
printHello();

関数.js:

function printHello() {
    print('Hello World!');
}

出力:

Hello World!

それが最もエレガントな方法かどうかはわかりませんが、うまくいきます。

于 2012-09-10T19:23:34.977 に答える