【问题标题】:Enable scripting mode for nashorn in java在java中为nashorn启用脚本模式
【发布时间】:2014-11-11 19:45:53
【问题描述】:

我必须使用 nashorn 从 Java 执行一些 bash shell 命令。

我有一个 javascript 文件:

#!/usr/bin/jjs

var testBashMethod = function(name){

    $EXEC("echo Hello from bash ${name}");
};

testBashMethod("foobar");

我有java方法将上面的javascript方法加载到Nashorn引擎中并执行它:

public void executeScript(){

    ScriptEngineManager engineManager = new ScriptEngineManager();
    ScriptEngine engine = engineManager.getEngineByName("nashorn");

    engine.eval(new FileReader("script.js"));

    Invocable invocable = (Invocable)engine;
    invocable.invokeFunction("testBashMethod");
}

在执行上述方法时,我收到以下错误:

jdk.nashorn.internal.runtime.ECMAException: ReferenceError: "$EXEC" is not defined

我的猜测是我需要在 java 中以脚本模式加载 nashorn 引擎。 在终端上,我可以使用脚本模式运行引擎,然后成功执行以下命令:

jjs -scripting
jjs> $EXEC('echo Hello World..!!')

我的问题:如何在 Java 脚本模式下加载 nashorn 引擎?以便 bash 脚本方法可用。还是我还缺少其他东西。

感谢您的帮助。

【问题讨论】:

    标签: java javascript bash java-8 nashorn


    【解决方案1】:
    NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
    ScriptEngine engine = factory.getEngine(new String[] { "-scripting" });
    

    有关更多文档,请参阅Nashorn Wiki。我从Nashorn jsr223 engine notes 页面获得(并修改了)上述 sn-p。

    【讨论】:

      【解决方案2】:

      您也可以通过“nashorn.args”系统属性定义 nashorn 选项。所以,像

      java -Dnashorn.args=-scripting MyMainClass

      将起作用,您的代码可以坚持使用 javax.script API(无需使用 jdk.nashorn.api.scripting API)。但这意味着您的 Java 进程创建的所有引擎都将启用脚本模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 2016-07-04
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        相关资源
        最近更新 更多