TL;DR
Gradleが参照するリポジトリの優先順位は定義した順です。
説明
投稿時点最新バージョン(5.0)のGradleのドキュメントに以下のように書かれています。
A project can have multiple repositories. Gradle will look for a dependency in each repository in the order they are specified, stopping at the first repository that contains the requested module.
なので、以下のように書いている場合は
repositories {
google()
mavenCentral()
jcenter()
}
- Maven Central
- JCenter
の順に優先されます。
Googleで見つからなければMaven Centralへ、Maven Centralで見つからなければJCenterへ…といった感じで依存関係の解決を試みます。
また、上記の他にも以下のような優先順位決定のルールが存在します。
- アーティファクトのみ(jarだけなど)より、メタデータファイル(pomなど)が存在するモジュールを優先する
- モジュールが依存しているものは、同じリポジトリから依存関係を解決する
詳細は以下のドキュメントを参照してください。
- https://docs.gradle.org/current/userguide/introduction_dependency_management.html#sec:dependency_resolution
- https://docs.gradle.org/current/userguide/declaring_repositories.html#sec:declaring_multiple_repositories
調べた背景
GitLabでAndroidのビルドを行っているのですが、ビルドが不安定で2回に1回程度の頻度で失敗していました。
失敗しているジョブを確認すると、取得しにいくjarは異なれどJCenterにjarを取りにいくところで 403 Forbidden
になっていることは共通しており、JCenterが不安定なんだなと判断しました。
ただ、JCenterにしか無いjarが存在していたため、リポジトリから外すことが出来ず、なら優先順位を下げられないか?と考えたのが調査した背景です。
まとめ
調べた結果は上述した通りです。
JCenterから取得する箇所は残っているものの、格段にビルドが安定しました。
まだ安定しない場合は、インハウスリポジトリとしてNexusをたてているので、Nexusをプロキシリポジトリにしてしまおうかと考えています。
経験者つよい
403でハマってて同僚に相談に行ったら「同じとこ(サーバー)でエラー出てない?」と含みのある感じで聞かれました。最初から完全にJCenterを疑ってたし正解だし凄い…
jcenterこのやろう
— てんてん😇 (@tenten0213) 2018年12月12日
jcenterでハマっている人を見ると、親近感を覚える
— かずひら (@kazuhira_r) 2018年12月12日