Compresi un file JavaScript durante Rhino eval

Come includere uno script "Bar" da un altro script "Foo" che viene valutato dal Rhino Engine, in esecuzione in Java.

IE, imposta il motore di script come in Java:

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

… e metti in Foo:

 load(["Bar.js"]) 

Secondo la documentazione shell di Rhino , questo è il modo per farlo. Ma quando si esegue da Java, non è chiaramente implementato:

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

@Phillip:

Grazie per la risposta creativa. La tua soluzione non funziona affatto poiché eval non rende disponibile la function parsed se non viene utilizzata l'interface invocabile. Inoltre, non funziona nei casi in cui il codice Java non è accessibile. Ho elaborato la tua soluzione e ho creato qualcosa che funziona in JS puro:

Innanzitutto creare un motore, esponendo l'interface invocabile:

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

Poi "load ()" lo script (s)

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

A questo punto le funzioni possono essere valutate con:

 engine.invokeFunction("printHello", null); 

Sono riuscito a farlo passando il motore a se stesso e poi chiamando eval () su di esso all'interno del codice Javascript:

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

function.js:

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

produzione:

 Hello World! 

Non so se questo è il modo più elegante per farlo, ma funziona.