【问题标题】:Is it possible to import javascript files to a java ScriptEngine是否可以将javascript文件导入java ScriptEngine
【发布时间】:2017-07-15 09:47:04
【问题描述】:

我正在使用 nashorn java ScriptEngine。我想评估一个包含其他脚本的脚本。我知道我可以直接在 javascript 本身中使用 load 指令,但我更愿意直接从实例化 scriptEngine 的 java 代码中导入或加载它。 有没有办法做到这一点 ?类似的东西:

void evaluateScript(String scriptName, String dependency) {
    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine jsEngine = factory.getEngineByName("nashorn");
    jsEngine.load(depency); // does not exist.
    jsEngine.eval();
}

我看到“加载”功能不存在。我怎样才能做到这一点?

谢谢

【问题讨论】:

    标签: javascript java nashorn


    【解决方案1】:

    实际上我自己找到了答案:正如评论中提到的,可以使用不同的脚本、相同的引擎调用多个 eval,并且引擎会将评估的脚本保留在其上下文中。所以这是我的代码:

    public void executeScript(String scriptName, String[] dependencies) {
        try {
            FileReader script = new FileReader(scriptName);
            ScriptEngineManager factory = new ScriptEngineManager();
            ScriptEngine jsEngine = factory.getEngineByName("nashorn");
    
            if(dependencies != null) {
                for (String dependency : dependencies) {
                    FileReader dependencyFile = new FileReader(dependency);
                    jsEngine.eval(dependencyFile);
                }
            }
    
            jsEngine.eval(script);
        }
    }
    

    我可以在我的依赖中定义函数,并在名为 scriptName 的脚本中使用它们。

    【讨论】:

      【解决方案2】:

      javax.script.ScriptEngine 有许多“eval”方法 - 有 java.io.Reader 接受这样的 eval 方法 -> eval

      您可以传递 java.io.FileReaderjdk.nashorn.api.scripting.URLReader 以从文件或 URL 加载脚本。

      【讨论】:

      • 您好,感谢您的回答,但它不适合我的问题:我想执行一个脚本 theScript,以及其他脚本 otherScriptList。但我会尝试使用相同引擎对不同脚本进行 eval,并检查引擎是否将之前的脚本保留在他的上下文中。
      • 是的,同一个引擎保持“上下文”!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      相关资源
      最近更新 更多