10

有没有什么好的教程或类似的东西可以说明这一点?尽管我已经熟悉 JavaScript,但我还没有用 Java 编写任何脚本。谢谢。本质上,我想使用 JavaScript/XML 来处理我的部分项目。我知道 Java 8 通过 Nashorn 引入了 JavaScript 支持。我想了解这是如何工作的。我知道它涉及使用 javax.script,但我不知道该包是如何工作的,也不了解 Nashorn 是如何工作的。

4

4 回答 4

17

在过去的几周里,我和 nashorn 玩了很多。我在一个示例驱动的教程中写下了我的所有发现:

http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/

它涵盖以下主题:

  • 从 java 代码调用 javascript 函数
  • 从 javascript 调用 java 方法
  • 在 javascript 中使用 java 类
  • 所有语言扩展的摘要(例如每个)

希望从 Nashorn 入手对您有所帮助。

于 2014-04-05T22:10:18.897 回答
11

最近,我做了几次关于 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");

此外,jjsJDK8 附带了一个工具。它是 CLI JavaScript 解释器。它可用于用 JavaScript 和 Java 编写 shell 脚本。(好的SO 建议如何改进jjsosx、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]);
}

如果您有任何问题,请随时提出问题。

谢谢,

维克

于 2014-03-27T14:27:48.920 回答
2

这是一个很好的、非常基本的“入门”视频:

https://www.youtube.com/watch?v=Cxyg22C5gcw

Julien Ponge 还写了一篇很好的介绍性文章:

http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html

我还推荐 Nashorn Wiki 作为正式文档:

https://wiki.openjdk.java.net/display/Nashorn/Main

于 2014-03-28T10:38:45.210 回答
2

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;
    }

}
于 2014-03-26T00:05:39.643 回答