2012-09-10 49 views
3

如何在Rhino引擎評估的另一個腳本「Foo」中包含腳本「Bar」,運行在Java中。在Rhino eval期間包含JavaScript文件

IE,安裝腳本引擎像這樣在Java中:

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("javascript"); 
BufferedReader br = new BufferedReader(new FileReader(new File("Foo.js"))); 
engine.eval(br); 

...並把Foo中的以下內容:

load(["Bar.js"]) 

Rhino shell documentation,這是應該做的方式。但是從Java運行時,它顯然沒有實現:

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "load" is not defined. 

@Phillip:

感謝您的創造性的反應。您的解決方案不太可行,因爲除非使用Invocable接口,否則eval不會使解析的函數可用。此外,它在Java代碼不可訪問的情況下不起作用。我闡述了您的解決辦法,創造的東​​西,將純JS的工作:

首先創建一個引擎,露出了Invocable接口:

var engine = new Packages.javax.script.ScriptEngineManager().getEngineByName("javascript"); 
engine = Packages.javax.script.Invocable(engine); 

然後「負載()」腳本(S)

engine.eval(new java.io.FileReader('./function.js')); 

在這一點上,功能可與評估:

engine.invokeFunction("printHello", null); 
+0

注意:這不是在Rhino shell或瀏覽器中執行。 –

回答

5

我成功地做到過b Ÿ通過發動機本身,然後調用它的eval()Javascript代碼裏面:

Java代碼:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); 
engine.put("engine", engine); 
engine.eval(new FileReader("test.js")); 

test.js:

engine.eval(new java.io.FileReader('function.js')); 
printHello(); 

function.js:

function printHello() { 
    print('Hello World!'); 
} 

輸出:

Hello World! 

我不知道這是否是最優雅的方式來做到這一點,但它的工作原理。

+7

「喲,我聽說你喜歡ScriptEngines,所以我在你的引擎中放了一個引擎,所以你可以在你評估的時候進行評估!」 – Philipp

+0

謝謝菲利普,這將大部分工作。 (見上面我的編輯) –

+1

你做的和我不同的是你在Javascript部分創建了一個新的ScriptEngine。在調用eval之前,我通過使用engine.put()的Java部分中的ScriptEngine來跳轉到Javascript代碼中,所以我已經有引擎了。我測試了它 - 它完美地工作。這當然假設您可以控制應用程序的Java部分。當您爲別人應用程序編寫腳本時,在Javascript部分中創建ScriptEngine是唯一的方法。 – Philipp