我遇到了Rhino通过javax.script.ScriptEngine
API运行Rhino时抛出"Encountered code generation error while compiling script: generated bytecode for method exceeds 64K limit"异常的问题。接受的解决方案似乎是在setOptimizationLevel(-1)
上调用sun.org.mozilla.javascript.Context
。
很遗憾,我似乎无法访问由Context
创建的ContextFactory
。我尝试将ContextFactory.Listener
添加到ContextFactory.getGlobal()
,以便在创建后修改Context
,但我的监听器似乎永远不会被调用。我还查看了RhinoScriptEngine source from Java 6,看看是否有一个属性我可以设置ContextFactory
将读取以确定优化级别的值。
据我所知,在Java 7中,RhinoScriptEngine
默认情况下将优化级别设置为-1
,可以通过{设置优化级别{1}}财产。将Java 7 version中的rhino.opt.level
方法与Java 6 version中的makeContext()
方法进行比较,看看我的意思。
据我所知,我认为我最好的选择是直接运行Rhino,如in this example of using Rhino to run the CoffeeScript compiler所示。虽然你可以看到,代码很麻烦,所以如果可能的话,我宁愿使用makeContext()
API,同时继续支持Java 6.还有其他选择吗?
答案 0 :(得分:2)
否,根据文档:http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine
它说:
由于足迹和安全原因,一些组件被排除在外:
- JavaScript-to-bytecode编译(也称为“优化器”)。这个 功能取决于类生成库。删除这个 功能意味着 JavaScript将始终被解释。该 删除此功能不会影响脚本执行,因为 优化器是透明的。
醇>
已排除优化器类以将其与JDK6捆绑在一起,因此无法为java 6设置优化级别。
答案 1 :(得分:1)
我正在使用6运行,默认情况下它似乎也设置为-1。或者更确切地说,除非sun.org.mozilla.javascript.internal.optimizer.Codegen
在类路径上,否则它设置为-1。