cloud-endpointsを使っているとkaptでコンパイルできなかった
Kotlinでaptがサポートされてサイコーに捗りそうですね。
早速試してたんですが、以下のエラーが出てコンパイルできないケースがありました。
java.lang.NoSuchMethodError: com.google.common.collect.Queues.newArrayDeque()Ljava/util/ArrayDeque;
原因?
原因はどうもcloud-endpointsのようです。以下の様にcloud-endpointsのclient libをdependenciesに書いている状態でkaptを使うとエラーになります。
compile project(path: ':api', configuration: 'android-endpoints') compile 'com.google.dagger:dagger:2.0' kapt 'com.google.dagger:dagger-compiler:2.0' provided 'org.glassfish:javax.annotation:10.0-b28'
もうちょい細かく見てみると、client libが参照するcom.google.api-client:google-api-client:1.20.0
が入っているとコケるみたいです。それが何故なのかはわかりません。
groovyでdaggerを使う際も同様のエラーが起こる事があり*1、その場合はgroovyOptions.fork = false
で解決できるらしいですがcloud-endpointsの方はよくわかりません。
解決策
cloud-endpointsへの参照をproject
からfileTree
にすればいけます(file
でもよさそう)。
compile fileTree(dir: '../api/build/libs', include: ['*.jar'])
generateしたclient libraryは以下のライブラリ群に依存しているので書き足します。
compile 'com.google.http-client:google-http-client-android:1.20.0' compile 'com.google.http-client:google-http-client:1.20.0' compile 'com.google.http-client:google-http-client-android:1.20.0' compile 'com.google.http-client:google-http-client-jackson2:1.20.0' compile 'com.google.oauth-client:google-oauth-client:1.20.0'
また、com.google.api-client:google-api-client:1.20.0のjarをダウンロードしてlibs
あたりに置きます。
ただしこの場合、api
側を修正した場合appengineEndpointsExportClientLibs
でclient libを生成しなおさないといけません。appengineEndpointsExportClientLibs
タスクは以下の様にclientLibJarOut
の設定がないと動かないので注意してください。
appengine { endpoints { clientLibJarOut = new File("build/libs") } }