包括犀牛EVAL中的JavaScript文件(Including a JavaScript file

2019-06-28 03:21发布

如何一个将包括脚本“酒吧”从另一个脚本“富”正由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"])

据犀牛程序文档 ,这是应该做的方式。 但是从Java运行时,它显然没有实现:

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

@Phillip:

感谢您的创造性的反应。 您的解决方案原样完全不是那么回事,因为EVAL根本不提供解析功能,除非使用了Invocable接口。 此外,它不会在情况下,Java代码不能访问工作。 我阐述了您的解决办法,创造的东​​西,将纯JS的工作:

首先创建一个引擎,露出了Invocable接口:

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

那么, “负荷()” 脚本(S)

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

在这一点上,功能可与评估:

engine.invokeFunction("printHello", null);

Answer 1:

我设法通过它传递引擎本身,然后调用eval()函数的Javascript代码中做到这一点:

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!

我不知道这是最优雅的方式来做到这一点,但它的作品。



文章来源: Including a JavaScript file during Rhino eval