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