5

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
4

1 に答える 1

6

既知の制限がありますが、間違いなく Groovy ではありません。それはASM ライブラリであり、最終的には Java です。

Stuart Hallowayが講演で述べたように、抽象化のレベルの 1 つ下のレイヤーで何が起こっているかを知ることは、多くの場合洞察力に富んでいます。

たとえば、このリンクは、このコードが次のことを示しています。

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 メソッドがこの例外をスローするのはなぜですか? この投稿には次のように記載されています。

「コードが大きすぎます」エラーのマジック ナンバーは 65535 バイト (ソース コードではなく、コンパイルされたバイト コード) であることが判明しました。

ファイルが Groovy の内部実装に対して大きすぎる可能性があり、その結果、合成メソッドが JVM に対して大きすぎます。

于 2013-07-20T19:55:51.983 に答える