Gradleでテストしてたら、asmが被った
GradleでJUnit4+Robolectricをターミナルから動かしてます(仕事じゃなくって現実逃避ですけど)。IDEからはapp.imlを直接いじるという面倒なセットアップが無いと動きませんので、世の中の進歩をまつことにしてます。
今日、突然その環境が動かなくなりました。現象としては./gradlew testを実行すると、java.lang.NoSuchMethodErrorでストップ。
java.lang.NoSuchMethodError: org.objectweb.asm.MethodVisitor.visitMethodInsn(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V at org.objectweb.asm.commons.GeneratorAdapter.invokeInsn(Unknown Source) at org.objectweb.asm.commons.GeneratorAdapter.invokeVirtual(Unknown Source) at org.robolectric.bytecode.AsmInstrumentingClassLoader$ClassInstrumentor.instrumentConstructor(AsmInstrumentingClassLoader.java:557) 以下、省略
みるとasmがエラーだしてます。他なら原因しばらくわからなかったと思いますが、asmと来れば昔からピンと来るのがバージョン不整合。こういう時はテスト実行には関係無くともapp.imlを見るとGradleがどういう依存解決しているかが一発でわかります。実際、asm5とasm4が混在してました。orderEntryタグのscope属性を見ると「TEST」で5、指示無しで4が入ってますからこれはcompileで最近足したやつが4もってきちゃってるという。。。MarkdownのパーサーのPegDownというのが今回の原因でした。
compile ('org.pegdown:pegdown:1.4.2') { exclude group: 'org.ow2.asm' }
これを足してテストは動くようになったが。。。今度はPegDownがダメになった。
Caused by: java.lang.IllegalStateException at org.objectweb.asm.tree.ClassNode.<init>(Unknown Source) at org.parboiled.transform.ParserClassNode.<init>(ParserClassNode.java:41)
中のParboiledがサヨナラしてます。さらにParbiledのGithubに行くとasm問題は他にもあったみたい(Java8で動かないことがあったらしい)でasm5に上げる作業はされてました。さてどう料理したものかね?Snapshotで手元ビルドか。。。面倒だな。つまらなさが現実逃避で可能な下限域を超えてきた。