GWT:GWTコンパイルでjava.lang.IncompatibleClassChangeError



問題

GWTのコンパイルで次のようなエラーが出た。完全にコンパイラがストップしてしまう。

[ERROR] Unexpected internal compiler error
java.lang.IncompatibleClassChangeError: class com.google.gwt.dev.javac.BytecodeSignatureMaker$CompileDependencyVisitor has interface org.objectweb.asm.ClassVisitor as super class
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at com.google.gwt.dev.javac.BytecodeSignatureMaker.visitCompileDependenciesInBytecode(BytecodeSignatureMaker.java:227)
    at com.google.gwt.dev.javac.BytecodeSignatureMaker.getCompileDependencySignature(BytecodeSignatureMaker.java:209)
    at com.google.gwt.dev.javac.CompiledClass.getSignatureHash(CompiledClass.java:165)
    at com.google.gwt.dev.javac.Dependencies$Ref.<init>(Dependencies.java:41)
    at com.google.gwt.dev.javac.Dependencies$Ref.<init>(Dependencies.java:36)
    at com.google.gwt.dev.javac.Dependencies.resolve(Dependencies.java:100)
    at com.google.gwt.dev.javac.CompilationStateBuilder$CompileMoreLater.compile(CompilationStateBuilder.java:352)
    at com.google.gwt.dev.javac.CompilationStateBuilder.doBuildFrom(CompilationStateBuilder.java:548)
    at com.google.gwt.dev.javac.CompilationStateBuilder.buildFrom(CompilationStateBuilder.java:479)
    at com.google.gwt.dev.javac.CompilationStateBuilder.buildFrom(CompilationStateBuilder.java:465)
    at com.google.gwt.dev.cfg.ModuleDef.getCompilationState(ModuleDef.java:423)
    at com.google.gwt.dev.Precompile.precompile(Precompile.java:222)
    at com.google.gwt.dev.Precompile.precompile(Precompile.java:202)
    at com.google.gwt.dev.Precompile.precompile(Precompile.java:143)
    at com.google.gwt.dev.Compiler.compile(Compiler.java:204)
    at com.google.gwt.dev.Compiler.compile(Compiler.java:155)
    at com.google.gwt.dev.Compiler.compile(Compiler.java:144)
    at com.google.gwt.dev.Compiler$1.run(Compiler.java:118)
    at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:55)
    at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:50)
    at com.google.gwt.dev.Compiler.main(Compiler.java:125)

> Task :sampleModules FAILED

原因

これだった。vaadinも使っていないし、hibernateも使っていないのだが、原因は同じである。

つまり、他のライブラリを混ぜるとGWTコンパイラが使用しているASMライブラリとは別のものが入ってしまうせいである。

しかも、コンパイラやコードサーバが格納されているgwt-dev.jarは、他のライブラリが「ほぐして入れてある」ので、何を使っているのか、どのバージョンなのかがわかりにくいのである。

対策

根本的な原因はgwtp-clientにあった。ここから不要なものを削除する。しかし、なんだってgwt-userやらgwt-devまで入れてしまうのだろうか???こちらの使いたい2.8.2では無いので必ず除去しなければならないのだ。

dependencies {
  api('com.gwtplatform:gwtp-mvp-client:1.6') { 
    exclude module: 'gwt-user'
    exclude module: 'gwt-dev'
    exclude module: 'velocity'
    exclude module: 'jsr305'
    exclude module: 'asm' // <-------
  }