[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
この記事は Creative Commons by-by 3.0 で公開されている記事を翻訳したものです。その為、この記事も同じライセンスとなります。
元記事は Method code too large in Groovy & Grails? - Stack Overflow です。
Method code too large in Groovy & Grails? - Stack Overflow の翻訳です。ある日のこと、会社の後輩が「なんじゃそりゃあああ」ってしてたので「どうしたの?」したら「ひよちゃん、java.lang.RuntimeException: Method code too large
って何」と問われたので調べてみたところ見つけたところです (まぁ、これだけでは後輩の問題は解決しないんだけど……)。
2014-06-17 11:22:18,622 [Thread-11] ERROR compiler.GrailsProjectWatcher - Compilation Error: startup failed: General error during class generation: Method code too large!
これ、どうしたらいいかな? 4,5 行ほどコードをコメントアウトしてもう一度試したら問題なく動きます BootStrap ファイルのサイズは 149KB しかないのですが……
JVM (Java Virtual Machine) の制限で1メソッドの長さは 65536 bytes までと決まっています。これについてはこの記事が詳しく説明しています。この問題を解決する最善策は大きなメソッドをいくつかの小さなメソッドに分割することであり、ベストプラクティスです。
また、JVM の JIT compiler は 8192 bytes より長いコードをコンパイルしません。この挙動は -XX:-DontCompileHugeMethods で変更できます。
日時 2014年6月17日 06:15
返答者 dror-bereznitsky
後輩が直面したのは Groovy on Jenkins でのことであった。以上の情報でこれを後輩に解決してこい、というのはちょっと無茶である。この問題は結構前から知られているようであり ([JENKINS-37984] org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: General error during class generation: Method code too large! error in pipeline Script - Jenkins JIRA) また、解決も難しいだろう。大変ありがたいことに [JENKINS-56500] Declerative pipeline restricted in code size - Jenkins JIRA 曰く以下の通りらしい。
When working with a declarative pipeline script, we run into an error "Method Code too large".
This seems to happen when the code between 'pipeline{}' is more than a specific size.
つまり パイプラインを記述したスクリプトを動かそうとしたが、 "Method Code too large" と言われて止まった。
どうも
とのことだ。これをそのまま信じるとすれば、パイプラインを分けるしかないんだろうなぁ……pipeline{}
が一定以上長いと発生するらしい。
前回書いた事案に関連して問題が多発したので探してきた。Semantics 5. The Groovy Truth にまとめが書いてあった。
割と JavaScript に似ていて難解だ。空の Map が false になるのはちょっと興味深いが納得感はある。asBoolean を定義することで自分で作ったクラスについては挙動を決められるのもありがたい。
会社でちょこちょこ groovy で書いたパイプラインを Jenkins 上で動かしている。そして、よく引っかかる問題がある。Jenkins 上でジョブを動かす時真偽値を与えることがしばしばある。私の環境だと DRY_RUN オプションとかだ。
しかし、次のようにするとうまくいかない。
if ( DRY_RUN ) { print "どらいらんだよー" } else { print "じっさいのどうさだよー" }
毎回 どらいらんだよー
が出力されてしまう。真偽値は文字列でわたっているからだ。以下のようにしないとダメらしい。
if ( DRY_RUN.equals( "true" ) ) { print "どらいらんだよー" } else { print "じっさいのどうさだよー" }
質問日時 2014年6月17日 05:28
質問者 wright