是否有任何好的教程或喜欢用这个说明?我还没有用Java编写任何脚本,尽管我已经熟悉了JavaScript。谢谢。基本上,我想使用JavaScript / XML来处理我的项目的一部分。我知道Java 8通过Nashorn引入了JavaScript支持。我想知道它是如何工作的。我知道它涉及使用javax.script,但我不知道该包是如何工作的,也不了解Nashorn是如何工作的。
答案 0 :(得分:16)
在过去的几周里我和nashorn一起玩了很多。我在一个示例驱动的教程中写了我的所有发现:
http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/
它包含以下主题:
我希望从Nashorn开始对你有所帮助。
答案 1 :(得分:11)
最近,我做了几个关于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
。它的CLI JavaScript解释器。它可以用于在JavaScript和Java中编写shell脚本。 (好SO advice如何在osx,linux上改进jjs
。
以下是此类脚本的示例
#!/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]);
}
如果您有任何问题,请随时提问。
谢谢,
维克
答案 2 :(得分:2)
通过标准的Java JSR 223脚本API访问Nashorn。
这里有一个很好的通用例子:
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;
}
}
答案 3 :(得分:2)
这是一个很好的,非常基本的“入门”视频:
https://www.youtube.com/watch?v=Cxyg22C5gcw
Julien Ponge也写了一篇很好的介绍性文章:
http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html
我还会推荐Nashorn Wiki的正式文档:
答案 4 :(得分:1)
Nashorn是Oracle在Java编程语言中开发的JavaScript engine。它基于(JSR 292)并已随Java 8发布。 Oracle的JDK 8或OpenJDK 8包含一个名为jjs的命令行工具。它可以在JDK安装的bin /文件夹中找到,还有着名的java,javac或jar工具。
最近我在Oracle Nashorn工作并编写了一个教程。我希望这会有所帮助