LoginSignup
4
1

More than 5 years have passed since last update.

[Grails]BootStrapに色々詰め込み過ぎるとコンパイル、実行できなくなる

Posted at

特に他愛のない話なのですが、こんなエラーがあったのか。。。と衝撃を受けたのでメモとして。
開発段階で非常に重宝するBootStrap.groovy。

BootStrap.groovyは大体以下のようなコードになります。

BootStrap.groovy
class BootStrap {
    def init = { servletContext ->
        environments {
            /**
             * ここに色々初期処理を書く
             */
        } 
    }
}

このenvironmentsクロージャの中に大体500行以上初期データの登録処理を書いていたら、grailsのcompileを実行した時に以下のようなエラーメッセージが表示されました。

| Error Compilation error: startup failed:
General error during class generation: Method code too large!

java.lang.RuntimeException: Method code too large!


...凄く長いStacktrace...

1 error
| Error Error running script compile: org.codehaus.groovy.grails.cli.ScriptExitException (Use --stacktrace to see the full trace)

エラーメッセージを見れば一目瞭然ですが、単純に一つのメソッドの中が長すぎる!って怒られているだけです。
実際の所そんなに長くないんだけど。。。と思うのですが、GroovyとかGrailsが裏で大量にコードを生成しているのかな?という感じです。

ちなみに、行数ではなくて実際のところはひとつのメソッドの中はコードの長さが64kbまでとJVM的に決まっているそうです。

http://stackoverflow.com/questions/24256316/method-code-too-large-in-groovy-grails
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.9.1

このエラーが発生した場合は、BootStrap.groovyの中にstaticメソッドを作ってその中に処理を書いて、メインのメソッド(クロージャ)の中ではそのstaticメソッドを呼び出すようにすればOKです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1