【发布时间】:2012-09-11 06:26:50
【问题描述】:
如何将脚本“Bar”包含在另一个脚本“Foo”中,该脚本正在由 Rhino 引擎评估,以 Java 运行。
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);
然后“加载()”脚本
engine.eval(new java.io.FileReader('./function.js'));
此时,可以使用以下方法评估函数:
engine.invokeFunction("printHello", null);
【问题讨论】:
-
注意:这不是在 Rhino shell 中执行的,也不是在浏览器中执行的。
标签: javascript rhino