Java ScriptEngine默认加载一个脚本
Java Load a script by default in ScriptEngine
是否有任何方法可以将外部脚本包含(或加载)到脚本引擎中,以便外部脚本中定义的所有函数都可以在 engine.eval()
方法中使用?
在我们的应用程序中,我们根据用户输入执行一些 java 脚本代码。当用户请求到来时,应用程序创建一个 ScriptEngine 实例并根据输入参数执行适当的 java 脚本代码。
这里的问题是 java 脚本中有一些重复的功能。考虑一个例子:
场景1:用户输入十进制经纬度时计算距离
-> 在这里我可以简单地计算和 return 距离。
场景2:当用户输入度-分-秒纬度和经度时计算距离。
-> 此处将度-分-秒输入转换为十进制经纬度,然后与场景 1 相同处理。
由于场景不同,calculateDistance 代码重复。
那么有什么方法可以让我拥有一个包含可重用函数的脚本并在我创建 ScriptEngine 实例时加载它。
注意:我正在使用 Java 8 以及捆绑的 Nashorn Java脚本引擎。
有什么想法and/or建议吗?
您可以在 javascript 代码 (doc here) 中使用 load()
函数。像 :
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'));
如果您的脚本源不是动态的,那么保持引擎的实例缓存也可能很有用,因为第一个冷 start/parsing 可能会很长。
是否有任何方法可以将外部脚本包含(或加载)到脚本引擎中,以便外部脚本中定义的所有函数都可以在 engine.eval()
方法中使用?
在我们的应用程序中,我们根据用户输入执行一些 java 脚本代码。当用户请求到来时,应用程序创建一个 ScriptEngine 实例并根据输入参数执行适当的 java 脚本代码。
这里的问题是 java 脚本中有一些重复的功能。考虑一个例子:
场景1:用户输入十进制经纬度时计算距离
-> 在这里我可以简单地计算和 return 距离。
场景2:当用户输入度-分-秒纬度和经度时计算距离。
-> 此处将度-分-秒输入转换为十进制经纬度,然后与场景 1 相同处理。
由于场景不同,calculateDistance 代码重复。 那么有什么方法可以让我拥有一个包含可重用函数的脚本并在我创建 ScriptEngine 实例时加载它。
注意:我正在使用 Java 8 以及捆绑的 Nashorn Java脚本引擎。
有什么想法and/or建议吗?
您可以在 javascript 代码 (doc here) 中使用 load()
函数。像 :
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'));
如果您的脚本源不是动态的,那么保持引擎的实例缓存也可能很有用,因为第一个冷 start/parsing 可能会很长。