0

有没有办法在脚本引擎中包含(或加载)外部脚本,以便外部脚本中定义的所有函数在engine.eval()方法中都可用?

在我们的应用程序中,我们根据用户输入执行一些 java 脚本代码。当用户请求时,应用程序创建一个 ScriptEngine 实例并根据输入参数执行适当的 javascript 代码。

这里的问题是javascript中有一些重复的功能。考虑一个例子:

场景1:当用户输入为十进制经纬度时计算距离
-> 这里我可以简单地计算并返回距离。

场景2:当用户输入为度-分-秒纬度和经度时计算距离。
-> 这里将度-分-秒输入转换为十进制的经纬度,然后处理与场景1相同。

由于它们是不同的场景,因此计算距离代码是重复的。那么有什么方法可以让我拥有一个包含可重用函数的脚本并在我创建 ScriptEngine 实例时加载它。

注意:我使用 Java 8 和捆绑的 Nashorn JavaScript 引擎。

有什么想法和/或建议吗?

4

1 回答 1

0

您可以load()在您的 javascript 代码中使用该函数(此处为文档)。有点像:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("load('myScript.js');");

这是一种简单的方法,但不适合部署(相对路径总是改变,资源访问可能在您的 IDE、Jar、war 中有所不同......)。

我个人使用一个非常简单的界面来提供脚本内容,这些内容来自资源、外部文件、数据库……然后在eval().

public interface ScriptLoader {
  public String getScriptContent(String relativePath);
}

ScriptLoader loader;
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(loader.getScriptContent('myScript.js'));

如果您的脚本源不是动态的,那么保持引擎的实例缓存也可能很有用,因为第一次冷启动/解析可能会很长。

于 2015-01-09T16:06:48.993 回答