【发布时间】:2011-08-09 17:14:24
【问题描述】:
我遇到了 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)。
不幸的是,我似乎无法访问由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() 方法,看看我的意思。
据我所知,我认为最好的选择是直接运行 Rhino,如图 in this example of using Rhino to run the CoffeeScript compiler。尽管如您所见,代码更加混乱,所以如果可能的话,我更愿意使用javax.script.ScriptEngine API,同时继续支持 Java 6。还有其他选择吗?
【问题讨论】:
-
另一种选择是将 com.sun.script.javascript 包中的所有代码复制到一个新包中(或者可能是具有重命名类以访问包私有成员的相同包)并更改makeContext() 的实现来设置优化级别,但这似乎有点矫枉过正。
-
我遇到了同样的问题。 JDK8中的'Nashorn'是一个更高级的JS引擎,Nashorn可以解决64K的问题。