groovy と Jersey Client を一緒に使おうとすると、実行時に IncompatibleClassChangeError
が発生した。
Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface org.objectweb.asm.MethodVisitor, but class was expected
at org.codehaus.groovy.runtime.callsite.CallSiteGenerator.genConstructor(CallSiteGenerator.java:141)
at org.codehaus.groovy.runtime.callsite.CallSiteGenerator.genStaticMetaMethodSite(CallSiteGenerator.java:196)
at org.codehaus.groovy.runtime.callsite.CallSiteGenerator.compileStaticMethod(CallSiteGenerator.java:239)
at org.codehaus.groovy.reflection.CachedMethod.createStaticMetaMethodSite(CachedMethod.java:285)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.createStaticMetaMethodSite(StaticMetaMethodSite.java:111)
(以下略)
Solving asm conflicts after upgrading to Groovy 2.1 - Jayway このページによると、 asm
のバージョンが jersey と groovy とで競合しているのが原因ぽい。
>gradle dependencies
runtime - Runtime classpath for source set 'main'.
+--- org.glassfish.jersey.core:jersey-client:2.5.1
| +--- org.glassfish.jersey.core:jersey-common:2.5.1
| | +--- javax.ws.rs:javax.ws.rs-api:2.0
| | +--- javax.annotation:javax.annotation-api:1.2
| | +--- com.google.guava:guava:14.0.1
| | +--- org.glassfish.hk2:hk2-api:2.2.0-b21
| | | +--- javax.inject:javax.inject:1
| | | \--- org.glassfish.hk2:hk2-utils:2.2.0-b21
| | | \--- javax.inject:javax.inject:1
| | +--- org.glassfish.hk2.external:javax.inject:2.2.0-b21
| | +--- org.glassfish.hk2:hk2-locator:2.2.0-b21
| | | +--- org.glassfish.hk2.external:javax.inject:2.2.0-b21
| | | +--- org.glassfish.hk2.external:asm-all-repackaged:2.2.0-b21 ★ここと
| | | +--- org.glassfish.hk2:hk2-api:2.2.0-b21 (*)
| | | +--- org.glassfish.hk2:hk2-utils:2.2.0-b21 (*)
| | | \--- org.glassfish.hk2.external:cglib:2.2.0-b21
| | \--- org.glassfish.hk2:osgi-resource-locator:1.0.1
| +--- javax.ws.rs:javax.ws.rs-api:2.0
| +--- com.google.guava:guava:14.0.1
| +--- org.glassfish.hk2:hk2-api:2.2.0-b21 (*)
| +--- org.glassfish.hk2.external:javax.inject:2.2.0-b21
| \--- org.glassfish.hk2:hk2-locator:2.2.0-b21 (*)
\--- org.codehaus.groovy:groovy:2.0.7
+--- antlr:antlr:2.7.7
+--- org.ow2.asm:asm-tree:4.0 ★この辺が競合してる
| \--- org.ow2.asm:asm:4.0
+--- org.ow2.asm:asm-commons:4.0
| \--- org.ow2.asm:asm-tree:4.0 (*)
+--- org.ow2.asm:asm:4.0
+--- org.ow2.asm:asm-util:4.0
| \--- org.ow2.asm:asm-tree:4.0 (*)
\--- org.ow2.asm:asm-analysis:4.0
\--- org.ow2.asm:asm-tree:4.0 (*)
jersey が org.glassfish.hk2.external:asm-all-repackaged:2.2.0-b21
に依存してて、 groovy が org.ow2.asm:asm:4.0
に依存してる。
(jersey-common
が asm
に依存しているから、たぶん Client じゃなくてもこの問題は発生すると思われる)
jersey の方の asm
を推移的な依存関係の管理から外すと解決する。
build.gradle
dependencies {
compile ('org.glassfish.jersey.core:jersey-client:2.5.1') {
exclude module: 'asm-all-repackaged'
}
compile 'org.codehaus.groovy:groovy:2.0.7'
}
>gradle dependencies
runtime - Runtime classpath for source set 'main'.
+--- org.glassfish.jersey.core:jersey-client:2.5.1
| +--- org.glassfish.jersey.core:jersey-common:2.5.1
| | +--- javax.ws.rs:javax.ws.rs-api:2.0
| | +--- javax.annotation:javax.annotation-api:1.2
| | +--- com.google.guava:guava:14.0.1
| | +--- org.glassfish.hk2:hk2-api:2.2.0-b21
| | | +--- javax.inject:javax.inject:1
| | | \--- org.glassfish.hk2:hk2-utils:2.2.0-b21
| | | \--- javax.inject:javax.inject:1
| | +--- org.glassfish.hk2.external:javax.inject:2.2.0-b21
| | +--- org.glassfish.hk2:hk2-locator:2.2.0-b21
| | | +--- org.glassfish.hk2.external:javax.inject:2.2.0-b21 ★"asm-all-repackaged" が消えてる
| | | +--- org.glassfish.hk2:hk2-api:2.2.0-b21 (*)
| | | +--- org.glassfish.hk2:hk2-utils:2.2.0-b21 (*)
| | | \--- org.glassfish.hk2.external:cglib:2.2.0-b21
| | \--- org.glassfish.hk2:osgi-resource-locator:1.0.1
| +--- javax.ws.rs:javax.ws.rs-api:2.0
| +--- com.google.guava:guava:14.0.1
| +--- org.glassfish.hk2:hk2-api:2.2.0-b21 (*)
| +--- org.glassfish.hk2.external:javax.inject:2.2.0-b21
| \--- org.glassfish.hk2:hk2-locator:2.2.0-b21 (*)
\--- org.codehaus.groovy:groovy:2.0.7
+--- antlr:antlr:2.7.7
+--- org.ow2.asm:asm-tree:4.0
| \--- org.ow2.asm:asm:4.0
+--- org.ow2.asm:asm-commons:4.0
| \--- org.ow2.asm:asm-tree:4.0 (*)
+--- org.ow2.asm:asm:4.0
+--- org.ow2.asm:asm-util:4.0
| \--- org.ow2.asm:asm-tree:4.0 (*)
\--- org.ow2.asm:asm-analysis:4.0
\--- org.ow2.asm:asm-tree:4.0 (*)