gradle

Gradleが参照するリポジトリの優先順位について

TL;DR

Gradleが参照するリポジトリの優先順位は定義した順です。

https://twitter.com/mike_neck/status/1074545952038375425

説明

投稿時点最新バージョン(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.

https://docs.gradle.org/5.0/userguide/dependency_management_for_java_projects.html#sec:repositories_java_tutorial

なので、以下のように書いている場合は

repositories {
    google()
    mavenCentral()
    jcenter()
}
  1. Google
  2. Maven Central
  3. JCenter

の順に優先されます。

Googleで見つからなければMaven Centralへ、Maven Centralで見つからなければJCenterへ…といった感じで依存関係の解決を試みます。

また、上記の他にも以下のような優先順位決定のルールが存在します。

  • アーティファクトのみ(jarだけなど)より、メタデータファイル(pomなど)が存在するモジュールを優先する
  • モジュールが依存しているものは、同じリポジトリから依存関係を解決する

詳細は以下のドキュメントを参照してください。

調べた背景

GitLabでAndroidのビルドを行っているのですが、ビルドが不安定で2回に1回程度の頻度で失敗していました。

失敗しているジョブを確認すると、取得しにいくjarは異なれどJCenterにjarを取りにいくところで 403 Forbidden になっていることは共通しており、JCenterが不安定なんだなと判断しました。

ただ、JCenterにしか無いjarが存在していたため、リポジトリから外すことが出来ず、なら優先順位を下げられないか?と考えたのが調査した背景です。

まとめ

調べた結果は上述した通りです。

JCenterから取得する箇所は残っているものの、格段にビルドが安定しました。

まだ安定しない場合は、インハウスリポジトリとしてNexusをたてているので、Nexusをプロキシリポジトリにしてしまおうかと考えています。

経験者つよい

403でハマってて同僚に相談に行ったら「同じとこ(サーバー)でエラー出てない?」と含みのある感じで聞かれました。最初から完全にJCenterを疑ってたし正解だし凄い…