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' }