特に他愛のない話なのですが、こんなエラーがあったのか。。。と衝撃を受けたのでメモとして。
開発段階で非常に重宝する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です。