是否有可能将JavaScript文件导入到Java ScriptEngine

问题描述:

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

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

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

由于

其实我自己找到了答案:正如评论中提到的,可以用不同的脚本,相同的引擎来调用几个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); 
    } 
} 

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

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

可以传递一个java.io.FileReaderjdk.nashorn.api.scripting.URLReader加载来自文件或URL的脚本。

+0

你好,谢谢你的回答,但它不适合我的问题:我想执行一个脚本theScript,连同其他脚本otherScriptList。但是我会尝试使用相同的引擎对不同的脚本进行评估,并检查引擎是否保留之前的脚本。 – Joel

+0

是的,同样的引擎保持“上下文”! –