我遇到了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.Listener
到ContextFactory.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.還有其他選擇嗎?
一種選擇是將所有的代碼從com.sun.script複製。 javascript包放入一個新的包(或者可能與重命名的類訪問包私有成員相同)並更改makeContext()的實現來設置優化級別,但這看起來像是矯枉過正。 – bolinfest
我遇到了同樣的問題。 JDK8中的'Nashorn'是更高級的JS引擎,Nashorn可以解決64K的問題。 –