2013-07-20 23 views
3

我正在使用Groovy ConfigSlurper从Groovy脚本加载大型groovy文件(741KB),并在尝试执行编译时始终收到RuntimeException。Groovy ConfigSlurper给出的Class文件太大RuntimeException

Groovy的2.1.1,Java 1.6的(苹果/ MacOSX的)

我叫它像这样:

conf = new ConfigSlurper().parse(new File('conf.groovy').toURL()) 

,一定可以得到下面的异常。 ConfigSlurper可以编译的文件的大小有一个已知的限制吗?

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
General error during class generation: Class file too large! 

java.lang.RuntimeException: Class file too large! 
    at org.objectweb.asm.ClassWriter.toByteArray(Unknown Source) 
    at org.codehaus.groovy.control.CompilationUnit$15.call(CompilationUnit.java:797) 
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1036) 
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:573) 
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:551) 
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:528) 
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:279) 
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:258) 
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:244) 
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:202) 
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:212) 
    at groovy.lang.GroovyClassLoader$parseClass.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) 
    at groovy.util.ConfigSlurper.parse(ConfigSlurper.groovy:146) 
    at groovy.util.ConfigSlurper$parse.call(Unknown Source) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) 
    at write_users.run(write_users.groovy:19) 
    at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:257) 
    at groovy.lang.GroovyShell.run(GroovyShell.java:220) 
    at groovy.lang.GroovyShell.run(GroovyShell.java:150) 
    at groovy.ui.GroovyMain.processOnce(GroovyMain.java:588) 
    at groovy.ui.GroovyMain.run(GroovyMain.java:375) 
    at groovy.ui.GroovyMain.process(GroovyMain.java:361) 
    at groovy.ui.GroovyMain.processArgs(GroovyMain.java:120) 
    at groovy.ui.GroovyMain.main(GroovyMain.java:100) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:106) 
    at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:128) 

1 error 

回答

4

有一个已知的限制,但它可以说是不Groovy;它是ASM library并最终是Java。

由于Stuart Halloway已经在谈判中提到过,所以知道发生在抽象层次下一层的事情往往很有见地。

例如,this link表明该代码:

public byte[] toByteArray() { 
     if (index > Short.MAX_VALUE) { 
      throw new RuntimeException("Class file too large!"); 
     } 

......很可能这里显示的异常:

java.lang.RuntimeException: Class file too large! 
    at org.objectweb.asm.ClassWriter.toByteArray(Unknown Source) 

为什么ASM方法抛出此异常? This post状态:

事实证明,一个神奇的数字为“代码过大”的错误是 65535字节(编译后的字节代码,而不是源代码)。

该文件对于Groovy的内部实现来说可能太大,这会导致JVM的合成方法太大。