2013-02-19 54 views
3

我想從jdk.nashorn.*命名空間初始化Oracle的JavaScript nashorn引擎。 (nashorn圖書館是2013年1月的測試版)。如何直接初始化Nashorn上下文和引擎?

有一個web樣本,它使用javax.script.ScriptEngineManager實用程序類來調用引擎的Nashorn引擎實例。

var engine = ScriptEngineManager.getEngineByName(*) 

不過,我想保持從ScriptEngineManager了,所以我需要直接以同樣的方式犀牛可以調用引擎。

Context cx = Context.enter(); 
Scriptable scope = cx.initStandardObjects(); 

如何直接創建nashorn引擎實例?

+0

是的,我們可以看到「NashornScriptEngine」在Javadoc,但看起來像你只能用「> Java的運行你的評估和演示類-cp nashorn.jar :. EvalFile 的.js – theMarceloR 2013-03-24 04:06:51

+0

獲得發動機謝謝評論。theMarceloR。我試圖從.net中使用nashorn。在.NET中返回null的API ScriptEngineManager.getEngineByName('nashorn')可能是jvm和IKVM問題,因爲nashorn使用最新的JVM API dynamicinvoke,它與什麼.NET有。 – 2013-03-26 15:59:29

+0

在Java中,如果「ScriptEngineManager.getEngineByName('nashorn')」返回null,nashorn.jar不在類路徑中。不知道你需要在.NET中做什麼來解決這個問題。 – theMarceloR 2013-03-27 21:48:19

回答

3

javax腳本引擎按類型application/javascript Hashorn,取回腳本引擎並告訴它做什麼,它還提供可調用和可編譯的接口。

YOUT可能有興趣閱讀:How can I start coding with Oracle's Nashorn JS Engine and when will it replace Rhino in the OpenJDK?

用法示例:

import javax.*; //lib imports 
// we should use the javax.script API for Nahsorn 
ScriptEngineManager m = new ScripteEngineManager(); 
ScriptEngine e = m.getEngineByname("nashorn"); 
try { 
    e.eval("print('hello nashorn !')"); 
} catch(Exception e) { 
    // using jdk lower then version 8 maybe ? 
} 
+0

謝謝有用的信息,彼得。它將學習jrunscript源代碼。 – 2013-03-26 16:06:47

+0

最好的學習方法是閱讀主要在C中的Nashorn的源代碼,然後做你的東西。 – Peter 2013-03-26 21:07:06

+2

@Peter Nashorn是100%基於Java的實現http://parleys.com/play/5148922b0364bc17fc56c90e/chapter50/about最好的方法是學習jsr223 apis http://download.oracle.com/otn-pub/ JCP/java_scripting-1.0-FR-EVAL-OTH-JSpec/java_scripting-1_0-FR-spec.pdf – 2013-07-16 06:00:38

1

我發現初始化引擎的方式直接使用.NET沒有「

"javax.script.ScriptEngineManager" 

環境: IKVM.NET版本8 + .NET Framework 4.52

static void Main(string[] args) 
    { 

     jdk.nashorn.api.scripting.NashornScriptEngineFactory fact = new jdk.nashorn.api.scripting.NashornScriptEngineFactory(); 
     jdk.nashorn.api.scripting.NashornScriptEngine nashornengine = fact.getScriptEngine() as jdk.nashorn.api.scripting.NashornScriptEngine; 

     nashornengine.eval("var x = 1/3;"); 
     object result = nashornengine.get("x"); 
     Console.WriteLine("{0}", result); 
    } 

這使我可以直接與nashorn上下文方法直接交互。

compile() 
getFactory() 
invokeMethod() 
invokeFunction()