任何教程都是Java和Nashorn编写脚本的新手?

Mic*_*sef 9 javascript java java-8 nashorn

是否有任何好的教程或喜欢与此声明?我还没有用Java编写任何脚本,尽管我已经熟悉了JavaScript.谢谢.基本上,我想使用JavaScript/XML来处理我的项目的一部分.我知道Java 8通过Nashorn引入了JavaScript支持.我想知道它是如何工作的.我知道它涉及使用javax.script,但我不知道该包是如何工作的,也不知道Nashorn是如何工作的.

小智 16

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

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

它包括以下主题:

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

我希望从Nashorn开始对你有所帮助.


Vik*_*mov 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)");
    }
Run Code Online (Sandbox Code Playgroud)

}

test.js,您可以作为应用程序参数传递.

print("This is hello from test.js");
Run Code Online (Sandbox Code Playgroud)

此外,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]);
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

维克

  • Nashorn`eval`与JS`eval`不同 (3认同)

Kon*_*ong 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

这是我的代码加载静态库脚本并构建可调用自定义函数的示例:

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

}
Run Code Online (Sandbox Code Playgroud)