読者です 読者をやめる 読者になる 読者になる

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で手元ビルドか。。。面倒だな。つまらなさが現実逃避で可能な下限域を超えてきた。