推移的依存関係が原因のバージョン競合によるAndroidのビルドエラーと解決策
エラー詳細
RN制のアプリのAndroidのビルドができなくなった。
ビルド時に出力されるエラーは下記
``` org.gradle.api.resources.ResourceException: Could not get resource 'https://dl.google.com/dl/android/maven2/com/google/firebase/firebase-core/16.0.5/firebase-core-16.0.5-javadoc.jar'. at org.gradle.internal.resource.ResourceExceptions.failure(ResourceExceptions.java:74) at org.gradle.internal.resource.ResourceExceptions.getFailed(ResourceExceptions.java:57) at org.gradle.internal.resource.transfer.AccessorBackedExternalResource.withContentIfPresent(AccessorBackedExternalResource.java:146) at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator$11.call(BuildOperationFiringExternalResourceDecorator.java:237) at ... ```
build.gradle(Module.app)では下記のようにfirebase-coreは16.0.4を指定している
dependencies { implementation "com.google.firebase:firebase-core:16.0.4" }
ところがMVN レポジトリを見る限り、firebase-coreの最新版16.0.5は存在するが依存関係の指定通りのバーションを取得しない不具合が起きている。
対応と解説
バージョンのミスマッチを防ぐ為に強制的にfirebase-coreのバージョンを指定する
configurations.all { resolutionStrategy { force "com.google.firebase:firebase-core:16.0.4" } }
configurations
Gradleにおいて依存関係をグループ化したもの。
resolutionStrategy
依存関係のバージョンが競合を起こした場合は、resolutionStrategyを使い、ビルドスクリプトで全てのバージョン競合をユーザーが明示的に解決することができる。
公式ドキュメントではある依存関係がさらに依存する関係のことを「推移的依存関係」と呼び、これによる生じるバージョンの競合はそんなに稀な問題でもないらしいのでこの現象と解決方法は覚えておきたい。
参考サイト
Gradle 公式ドキュメント
- 8.3 依存関係のコンフィグレーション
- 51.2.3 バージョン競合の解決策
Gradleプロジェクトで依存関係の競合を解決する | GuildWorks Blog
Gradleで陥りやすい問題点の解決策TIPS集 - 猫好きモバイルアプリケーション開発者記録