首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新手使用Java和Nashorn编写脚本,有什么教程吗?

新手使用Java和Nashorn编写脚本,有什么教程吗?
EN

Stack Overflow用户
提问于 2014-03-26 03:26:43
回答 4查看 10.8K关注 0票数 10

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

EN

回答 4

Stack Overflow用户

发布于 2014-04-06 06:10:19

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

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

它涵盖了以下主题:

  • 从java代码中调用java脚本函数
  • 从所有语言扩展(例如,针对每个扩展)的javascript
  • using java类中调用java方法

我希望它对您从Nashorn开始有帮助。

票数 17
EN

Stack Overflow用户

发布于 2014-03-27 22:27:49

最近,我做了一些关于Java和JavaScript的演讲(通过Nashorn)。你可以找到我的幻灯片和例子here

下面是一个非常简单的脚本运行器实现

代码语言:javascript
复制
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。

代码语言:javascript
复制
print("This is hello from test.js");

此外,JDK8还附带了一个工具jjs。这是一个命令行界面JavaScript解释器。它可以用来用JavaScript和Java编写外壳脚本。(Good SO advice how to improve jjs on osx,Linux.)以下是此类脚本的一个示例

代码语言:javascript
复制
#!/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

票数 11
EN

Stack Overflow用户

发布于 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自定义函数的示例:

代码语言:javascript
复制
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;
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22644441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档