java - Groovy ConfigSlurper 给类文件太大的 RuntimeException

标签 java groovy runtimeexception

我正在使用 Groovy ConfigSlurper 从 Groovy 脚本加载一个大型 groovy 文件 (741KB),并在它尝试进行编译时始终收到 RuntimeException。

Groovy 2.1.1, Java 1.6 (Apple/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

最佳答案

有一个已知的限制,但可以说它不是 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状态:

It turns out that the magic number for the "code too large" error is 65535 bytes (compiled byte code, not source code).

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

关于java - Groovy ConfigSlurper 给类文件太大的 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17758510/

相关文章:

Java Minecraft Bukkit 推广插件

java - 使用 uinput 驱动程序创建虚拟多点触控设备

groovy - 调用Groovy闭包

Java:泛型方法和类型识别

java - Android 项目 - RuntimeException ,由 Null Pointer Exception 引起

android - 崩溃在 android.inputmethodservice.IInputMethodWrapper.setSessionEnabled(IInputMethodWrapper.java :280)

java - Nebula Nattable - 动态更改列

java - Grails 项目 : Gorm or JPA/Hibernate annotations for legacy db mapping?

java - 使用 java.util.logging Autoflush 在调试期间刷新流处理程序

android - 什么是 "all"迭代器?