有没有什么好的教程或类似的东西可以说明这一点?尽管我已经熟悉 JavaScript,但我还没有用 Java 编写任何脚本。谢谢。本质上,我想使用 JavaScript/XML 来处理我的部分项目。我知道 Java 8 通过 Nashorn 引入了 JavaScript 支持。我想了解这是如何工作的。我知道它涉及使用 javax.script,但我不知道该包是如何工作的,也不了解 Nashorn 是如何工作的。
4 回答
在过去的几周里,我和 nashorn 玩了很多。我在一个示例驱动的教程中写下了我的所有发现:
http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/
它涵盖以下主题:
- 从 java 代码调用 javascript 函数
- 从 javascript 调用 java 方法
- 在 javascript 中使用 java 类
- 所有语言扩展的摘要(例如每个)
希望从 Nashorn 入手对您有所帮助。
最近,我做了几次关于 Java 和 JavaScript 的演讲(通过 Nashorn)。您可以在此处找到我的幻灯片和示例。
这是一个非常简单的脚本运行器实现
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");
此外,jjs
JDK8 附带了一个工具。它是 CLI JavaScript 解释器。它可用于用 JavaScript 和 Java 编写 shell 脚本。(好的SO 建议如何改进jjs
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]);
}
如果您有任何问题,请随时提出问题。
谢谢,
维克
这是一个很好的、非常基本的“入门”视频:
https://www.youtube.com/watch?v=Cxyg22C5gcw
Julien Ponge 还写了一篇很好的介绍性文章:
http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html
我还推荐 Nashorn Wiki 作为正式文档:
Nashorn 通过标准的 Java JSR 223 脚本 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;
}
}