2017-07-15 63 views
0

我正在使用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(); 
} 

我看到「加載」功能不存在。我怎麼能做到這一點?

由於

回答

2

其實我自己找到了答案:正如評論中提到的,可以用不同的腳本,相同的引擎來調用幾個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); 
    } 
} 

我可以在我的依賴關係定義函數,並在名稱腳本名的腳本中使用它們。

0

javax.script.ScriptEngine有許多 「EVAL」 方法 - 有java.io.Reader中接受EVAL方法這樣的 - >eval

可以傳遞一個java.io.FileReaderjdk.nashorn.api.scripting.URLReader加載來自文件或URL的腳本。

+0

你好,謝謝你的回答,但它不適合我的問題:我想執行一個腳本theScript,連同其他腳本otherScriptList。但是我會嘗試使用相同的引擎對不同的腳本進行評估,並檢查引擎是否保留之前的腳本。 – Joel

+0

是的,同樣的引擎保持「上下文」! –

相關問題