如何包含脚本" Bar"来自另一个剧本" Foo"这是由Rhino Engine评估的,用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.
@Phillip:
感谢您的创意回复。您的解决方案并不常用,因为除非使用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);
答案 0 :(得分: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();
function.js:
function printHello() {
print('Hello World!');
}
输出:
Hello World!
我不知道这是否是最优雅的方式,但它有效。