tl;dr
- maven plugin を使ってない Android project で Gradle 7.0 を使うと JitPack で publish できなくなる
- Maven Publish Plugin で publication の設定を自分で書こう
発見
私が作ってる cast-sdk-ktx
は JitPack を使ってるのだけど、数日前の Cast SDK のバージョン更新に対応して、ついでに色々依存をアップデートしたのをリリースしようとしたら publish でこけてしまった。
ローカルで build する分には問題なかったので何でだろーって build log を見たところ以下のような log が出てた:
> Configure project : Gradle version Gradle 7.0 FAILURE: Build failed with an exception. * Where: Script '/script/maven-plugin.gradle' line: 2 * What went wrong: A problem occurred evaluating script. > Failed to apply plugin 'com.github.dcendents.android-maven'. > Could not create plugin of type 'AndroidMavenPlugin'. > Could not generate a decorated class for type AndroidMavenPlugin. > org/gradle/api/publication/maven/internal/MavenPomMetaInfoProvider
com.github.dcendents.android-maven
が原因とのこと。
調査
JitPack では publish のための build の際、project の gradle tasks を調べ、 publish に必要な task が存在しなかった場合にそれを追加するために plugin を導入する。
例として cast-sdk-ktx:0.1.0
の build log を見てみると、以下のような出力が見られる:
... Getting tasks: ./gradlew tasks --all Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 -Dhttps.protocols=TLSv1.2 Tasks: WARNING: Gradle 'install' task not found. Please add the 'maven' or 'android-maven' plugin. See the documentation and examples: https://jitpack.io/docs/ Adding android plugin Adding maven plugin Found android library build file in cast-ktx Found android library build file in cast-framework-ktx Found android library build file in cast-tv-ktx Running: ./gradlew clean -Pgroup=com.github.nashcft -Pversion=0.1.0 install ...
https://jitpack.io/com/github/nashcft/cast-sdk-ktx/0.1.0/build.log
上の抜粋では install
task が見つからないことを理由に plugin を導入すると言われている。この際に /script/maven-plugin.gradle
の apply が追記されて、その中に com.github.dcendents.android-maven
を使った publication の設定が記述されているのだろう。
今回はこの plugin の apply 中にエラーが発生しているので、原因は android-maven
plugin 中の実装と考えられる。Build script の実行時に plugin のエラーが起こったという状況なので関連するこちら側の変更は Gradle のバージョンだろう。Build が成功している 0.1.0
と今回エラーが発生した commit では Gradle が 6.8.3 から 7.0 に上がっている。
ところでこの com.github.dcendents.android-maven
だが、既に役割を終えているためにメンテナンスが止まっており、 repository も archive されている。
というわけで今回の問題が修正されることはないし、じゃあこれ以上は詮無しということで原因を追いかけるのも終わり。きっと "Could not generate a decorated class for type" でググれば出てくるだろう。
対処
上述のように publication のための plugin が project に入ってないと com.github.dcendents.android-maven
を使われてしまうので、project に publication のための設定を追加することでこの問題を回避できる。
Android Maven Plugin の README でも言及があるが、 AGP 3.6.0 以上では Gradle の Maven Publish Plugin が使えるので、それを apply して設定を追記すれば publication ができるようになる。
JitPack の GitHub organization にある Android の sample repo を見た感じ最低限の設定だけ書けば動きそう。
というわけで cast-sdk-ktx
にも Maven Publish Plugin を導入する pull request を作った。Publication の設定にどんなのがあるか色々眺めながら書いてたので JitPack の example より記述量が多くなっている。
これを書くことになると JitPack のいいところだったお手軽 publish の度合いが下がるので、もうちょっと頑張って Maven Central に移行してしまってもいいのでは...? と思わないこともない。