有没有什么好的教程或类似的东西来说明这一点?虽然我已经熟悉了JavaScript,但我还没有用Java语言编写脚本。谢谢。本质上,我希望使用JavaScript/XML来处理我的项目的一部分。我知道Java8通过Nashorn引入了JavaScript支持。我想知道它是如何工作的。我知道这涉及到使用javax.script,但我不知道这个包是如何工作的,也不了解Nashorn是如何工作的。
发布于 2014-04-06 06:10:19
在过去的几周里,我和nashorn玩了很多次。我把我所有的发现都写在了一个例子驱动的教程中:
http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/
它涵盖了以下主题:
我希望它对您从Nashorn开始有帮助。
发布于 2014-03-27 22:27:49
最近,我做了一些关于Java和JavaScript的演讲(通过Nashorn)。你可以找到我的幻灯片和例子here。
下面是一个非常简单的脚本运行器实现
import javax.script.*;
public class ScriptRunner {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
String scriptName = args[0];
Bindings bindings = nashorn.createBindings();
bindings.put("scriptFileName", scriptName);
nashorn.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
nashorn.eval("load('src/main/resources/javascript/' + scriptFileName)");
}}
可以作为应用程序参数传递的test.js。
print("This is hello from test.js");此外,JDK8还附带了一个工具jjs。这是一个命令行界面JavaScript解释器。它可以用来用JavaScript和Java编写外壳脚本。(Good SO advice how to improve jjs on osx,Linux.)以下是此类脚本的一个示例
#!/usr/local/bin/jjs -scripting
var currentDir = new java.io.File('.'),
allFiles = currentDir.list();
print(currentDir.getCanonicalPath());
for (var i = 0; i < allFiles.length; i++) {
print(allFiles[i]);
}如果您有任何问题,请随时提问。
谢谢,
Vik
发布于 2014-03-26 08:05:40
Nashorn是通过标准Java JSR223脚本API访问的。
下面是一个很好的通用示例:
http://www.drdobbs.com/jvm/jsr-223-scripting-for-the-java-platform/215801163
Nashorn的具体指导如下:
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes
下面是我的代码中加载静态库脚本并构建Invocable自定义函数的示例:
public class ScriptRunner {
private static final Logger log = LoggerFactory.getLogger(ScriptRunner.class);
private static final String ENGINE = "nashorn";
private String functions;
public ScriptRunner() throws IOException {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("your/class/path/*.js");
log.debug("Found {} script resources", resources.length);
StringBuilder functions = new StringBuilder();
for (Resource resource : resources) {
functions.append(IOUtils.toString(resource.getInputStream()));
}
this.functions = functions.toString();
}
/**
* Build an Invocable script.
* @param script The function code.
* @return Compiled, invocable script.
*/
public Invocable buildInvocable(String script) throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName(ENGINE);
engine.eval(functions);
engine.eval(script);
return (Invocable) engine;
}
}https://stackoverflow.com/questions/22644441
复制相似问题