GWT:java.lang.NoSuchMethodError: com.google.gwt.util.regexfilter.RegexFilter: method ()V not found



問題

GWTコンパイル中に以下のエラーが出ることがある。

:compileUserGwtException in thread "main" java.lang.NoSuchMethodError: com.google.gwt.util.regexfilter.RegexFilter: method <init>()V not found
    at com.google.gwt.util.regexfilter.WhitelistRegexFilter.<init>(WhitelistRegexFilter.java:21)
    at com.google.gwt.dev.jjs.JJSOptionsImpl.<init>(JJSOptionsImpl.java:54)
    at com.google.gwt.dev.PrecompileTaskOptionsImpl.<init>(PrecompileTaskOptionsImpl.java:39)
    at com.google.gwt.dev.CompilerOptionsImpl.<init>(CompilerOptionsImpl.java:30)
    at com.google.gwt.dev.Compiler.main(Compiler.java:108)
 FAILED

原因

GWT Compilation error in Eclipse Oxygenに説明がある。

コンパイルに使用しているGWTバージョンとは異なるgwt-userあるいはgwt-devが使われてしまっているらしい。GWTコンパイラはgwt-dev.jarに含まれているのだが、おそらくはそれとは異なるgwt-user.jarが使われてしまっている。あるいは逆かもしれない。

実は、コンパイル時に指定されるライブラリに、この「異なるバージョンのGWT」が紛れ込むことがある。なぜそれがコンパイル作業自体に影響するのか不明だが、ともあれ、これらを排除しなければならない。

GWTPのしわざだった

ひどいことにGWTPのライブラリの依存としてこれが指定されてしまっている。例えば以下だ。

|    +--- com.gwtplatform:gwtp-mvp-client:1.6
|    |    +--- com.gwtplatform:gwtp-clients-common:1.6
|    |    |    +--- com.google.gwt:gwt-user:2.8.0 (*)
|    |    |    +--- com.google.gwt:gwt-dev:2.8.0 -> 2.8.2

なぜこんな意味の無い指定をしているのか一切不明だが、これでは困るので、excludeで排除するかtransitive=falseとしなければならない。

  compile('com.gwtplatform:gwtp-mvp-client:1.6') { exclude group:'com.google.gwt' }