Rhinoでscope共有
なんかJSANでごにょったりしてたりするのでできねえのかなあとか思ってたんだけど。
AAA.jsとBBBB.jsを合わせて実行したいよおって場合コレでよくない?
例によって実験しながらのソースなんでめちゃ汚いんだけど。
RhinoRunner
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import org.mozilla.javascript.Context; import org.mozilla.javascript.Script; import org.mozilla.javascript.ScriptableObject; public class RhinoRunner { public static void main(String[] args) { Context cx = null; try { RhinoRunner runner = new RhinoRunner(); String filename1 = "C:\\foo.js"; String filename2 = "C:\\bar.js"; cx = Context.enter(); ScriptableObject sharedScope = cx.initStandardObjects(null, true); runner.run(cx, sharedScope, filename1); runner.run(cx, sharedScope, filename2); } catch (Exception e) { e.printStackTrace(); } finally { if (cx != null) { Context.exit(); } } } public void run(Context cx, ScriptableObject sharedScope, String filename) throws IOException { // String filename = "C:\\foo.js"; FileReader filin = new FileReader(filename); BufferedReader bufin = new BufferedReader(filin); try { runScript(cx, sharedScope, bufin, filename); } finally { bufin.close(); filin.close(); } } public void runScript(Context cx, ScriptableObject sharedScope, Reader in, String filename) throws IOException { Script script = cx.compileReader(in, filename, 1, null); Object result = script.exec(cx, sharedScope); if (result != Context.getUndefinedValue()) System.err.println(Context.toString(result)); } }
foo.js
function test(x, y){ return x+y; } var x = 1; var y = 2; var z = test(x,y);
bar.js
var x = 10; var y = 20; var z = test(x,y); java.lang.System.out.println(z);
barにはtestファンクションが存在しないことに注目。