visible true

技術的なメモを書く

cloud-endpointsを使っているとkaptでコンパイルできなかった

Kotlinでaptがサポートされてサイコーに捗りそうですね。

blog.jetbrains.com

早速試してたんですが、以下のエラーが出てコンパイルできないケースがありました。

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")
    }
}