2011-08-09 141 views
6

我遇到了Rhino通過javax.script.ScriptEngine API運行Rhino時異常拋出"Encountered code generation error while compiling script: generated bytecode for method exceeds 64K limit"的問題。接受的解決方案似乎是在sun.org.mozilla.javascript.Context上調用setOptimizationLevel(-1)是否可以在Java 6中爲RhinoScriptEngine設置優化級別?

不幸的是,我似乎無法訪問由ContextFactory創建的Context。我曾嘗試添加一個ContextFactory.ListenerContextFactory.getGlobal(),它會在創建後修改Context,但我的偵聽器似乎永遠不會被調用。我還查看了RhinoScriptEngine source from Java 6以查看是否有一個屬性可以設置ContextFactory從中讀取以確定優化級別的值。

至於我可以告訴大家,在Java 7,RhinoScriptEngine默認設置優化級別-1能夠通過設置在rhino.opt.level屬性的優化級別。比較Java 7 version中的makeContext()方法與Java 6 version中的makeContext()方法,以瞭解我的意思。

據我所知,我相信我最好的選擇是直接運行犀牛,如in this example of using Rhino to run the CoffeeScript compiler所示。雖然你可以看到,代碼很麻煩,所以如果可能,我寧願使用javax.script.ScriptEngine API,同時繼續支持Java 6.還有其他選擇嗎?

+0

一種選擇是將所有的代碼從com.sun.script複製。 javascript包放入一個新的包(或者可能與重命名的類訪問包私有成員相同)並更改makeContext()的實現來設置優化級別,但這看起來像是矯枉過正。 – bolinfest

+0

我遇到了同樣的問題。 JDK8中的'Nashorn'是更高級的JS引擎,Nashorn可以解決64K的問題。 –

回答

2

沒有,根據文檔:http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine

凡說:

幾個組件已排除由於足跡和安全方面的原因:

  1. JavaScript的到字節碼編譯(也稱爲「優化器」)。這個 功能取決於類生成庫。刪除這個 功能意味着JavaScript將始終被解釋爲。刪除此功能不會影響腳本執行,因爲 優化程序是透明的。

優化類已排除與JDK6捆綁因此它的優化級別不能爲Java設置等6

+0

但是,這不是這相當於-1的優化水平,這是OP想要的嗎?如果Java 6始終被解釋,則代碼生成編譯錯誤不應該在Java 6下發生。 – bacar

1

我用6運行,它也似乎默認設置爲-1。或者說,除非sun.org.mozilla.javascript.internal.optimizer.Codegen在類路徑上,否則它被設置爲-1。

+0

嗯,一個問題可能是我使用的OpenJDK: $ Java的版本 Java版本 「1.6.0_22」 OpenJDK的 運行時環境(IcedTea6 1.10.2)(6b22-1.10.2-0ubuntu1〜11.04.1 ) OpenJDK 64位服務器虛擬機(版本20。0-b11,混合模式) Sun JDK似乎與Rhino有一些差異。 我們不得不做一些很奇怪的事情,把事情上都的JDK我的項目工作,plovr: http://code.google.com/p/plovr/source/detail?r=7e3cad7f1b9d – bolinfest

相關問題