我开始探索 jdk 8 新的 javascript 引擎 nashorn 并想构建一些自动化任务脚本。我有一个问题,我不知道如何使用 engine.eval() 从 javascript 以脚本模式评估 js 文件,例如。
ps:我不是在谈论 jjs 脚本,它很好,但只能以一种方式工作。我想要另一种方式;使引擎在 java 脚本模式下进行评估
我开始探索 jdk 8 新的 javascript 引擎 nashorn 并想构建一些自动化任务脚本。我有一个问题,我不知道如何使用 engine.eval() 从 javascript 以脚本模式评估 js 文件,例如。
ps:我不是在谈论 jjs 脚本,它很好,但只能以一种方式工作。我想要另一种方式;使引擎在 java 脚本模式下进行评估
最简单的方法是将 -Dnashorn.args=-scripting 添加到您的 java 命令行。
经过大量的挠头,我想出了一个技巧,我可以通过手工制作的系统进程的命令行实际启动脚本的执行:
//tricking the nashorn engine with jjs command
public void evalScriptInScriptingMode(String fileName)
{
String[] args = new String[]{"jjs", "-scripting", fileName};
//This class is used to create operating system processes
ProcessBuilder pb = new ProcessBuilder(args);
pb.directory(null);
File log = new File("jjs_log.txt");
int i = 0;
while(log.exists())
{
i++;
log = new File("jjs" + i + "_log.txt");
}
pb.redirectErrorStream(true);
pb.redirectOutput(ProcessBuilder.Redirect.appendTo(log));
Process p = null;
try
{
p = pb.start(); //start the process which remains open
}
catch(IOException e)
{
e.printStackTrace();
}
}
您可以通过 NashornScriptEngineFactory 将参数传递给脚本引擎。
import jdk.nashorn.api.scripting.NashornScriptEngineFactory
new NashornScriptEngineFactory()
.getScriptEngine( "-scripting" )
.eval( "" );
您还可以使用new NashornScriptEngineFactory().getScriptEngine("-scripting");
它将在脚本模式下检索新的 Nashorn ScriptEngine。这种方法比使用系统进程稍微好一点,主要是因为它会自动将你的类添加到 nashorn 类路径中。
基本上,您可以在 java 中编写类,然后在 javascript 中使用它们。如果您不需要能够在 javascript 中引用您的类,那么系统进程应该做得很好并且不会有问题,(如果运行它的机器在其类路径中有 jjs)