[Android] 「依存関係が解決できない」時にまず疑うべき5つ(maven/https/証明書)

スポンサーリンク
  1. 導入:「依存関係が解決できない」は原因が広すぎてしんどい
  2. まず疑うべき5つ(一覧)
  3. 1) mavenリポジトリ設定(URL/順番/宣言場所)
    1. チェック1:repositories はどこで宣言している?
    2. チェック2:mavenCentral() / google() の順番
    3. チェック3:リポジトリURLが http になっていない?
    4. チェック4:リポジトリが落ちている/ブロックされている
  4. 2) HTTPS/証明書(PKIX、SNI、TLS、社内CA)
    1. 典型エラー
    2. チェック1:Gradleが使っているJDKはどれ?
    3. チェック2:社内CA(中間証明書)を使っている?
    4. チェック3:TLSバージョン・SNIの相性
  5. 3) プロキシ/VPN/フィルタ(社内ネットワーク)
    1. チェック1:Gradleがプロキシ設定を見ているか
    2. チェック2:VPN/セキュリティソフトの影響
    3. チェック3:名前解決(DNS)が怪しい
  6. 4) バージョン競合・解決戦略(BOM、依存ツリー)
    1. 典型症状
    2. まずやる:依存ツリーを出す
    3. 次にやる:BOMを使うものはBOMで揃える
    4. 最後にやる:resolutionStrategyで強制固定(最終手段)
  7. 5) キャッシュ破損・ミラー不整合(Gradleキャッシュ)
    1. まずは軽く:依存再取得
    2. 次に:Gradleデーモン停止
    3. 最後:~/.gradle/caches の削除(重い)
  8. 最短で原因に辿り着くための「調査の順番」
  9. デバッグ/確認チェックリスト
  10. よくある質問(Q&A)
    1. Q. 会社のネットだけ取れないです
    2. Q. PKIXって出たら何をすればいい?
    3. Q. –refresh-dependenciesでも直りません
  11. まとめ:依存が取れない時は「上から順に潰す」

導入:「依存関係が解決できない」は原因が広すぎてしんどい

Gradleビルドで突然出てくる、あの系のエラー。

  • Could not resolve all files for configuration
  • Could not find xxx
  • Failed to transform / Could not HEAD / PKIX path building failed

これ、慣れてても嫌です。原因が広いし、環境差も出るし、再現性も怪しい。

ただし、落ち着いて見ると「疑う順番」は決まっています。
この記事では、依存が解決できない時にまず疑うべき5つを、実務で使える切り分け手順としてまとめます。

先に結論(3行)です。

  • まずは「リポジトリ設定と順番」→ 次に「ネットワーク(Proxy/HTTPS)」
  • 証明書系(PKIX)は環境依存なので、JDK/TrustStore/中間CAを疑う
  • 最後にキャッシュ・競合・ミラー(社内)を潰す

まず疑うべき5つ(一覧)

先に全体像です。依存解決エラーは、基本この5カテゴリに落ちます。

  1. mavenリポジトリ設定(URL/順番/宣言場所)
  2. HTTPS/証明書(PKIX、SNI、TLS、社内CA)
  3. プロキシ/VPN/フィルタ(社内ネットワーク)
  4. バージョン競合・解決戦略(BOM、依存ツリー)
  5. キャッシュ破損・ミラー不整合(Gradleキャッシュ)

以降はこの順番で、確認ポイントとコマンドを出します。

1) mavenリポジトリ設定(URL/順番/宣言場所)

まずここです。依存が取れない時、根本は「どこから取るか」が壊れてるケースが多い。

チェック1:repositories はどこで宣言している?

最近は settings.gradle(.kts) 側でリポジトリ管理する構成が増えています。
プロジェクトによっては build.gradle で書いても無視されることがあります。

まずは以下を確認します。

  • settings.gradle(.kts) に dependencyResolutionManagement があるか
  • repositoriesMode が “FAIL_ON_PROJECT_REPOS” などになっていないか
  • build.gradle の repositories が効いている構成か

チェック2:mavenCentral() / google() の順番

順番が原因で解決が遅くなったり、到達できないリポジトリを先に見に行って詰まることがあります。

実務的には、

  • google()
  • mavenCentral()
  • (社内maven / jitpack 等)

の順が安定しやすいです。怪しいリポジトリ(落ちやすい、遅い)を先頭に置くのは避けます。

チェック3:リポジトリURLが http になっていない?

http は最近の環境だと弾かれることがあります。
https でアクセスできるなら必ず https に寄せます。

チェック4:リポジトリが落ちている/ブロックされている

「自分のPCだけ」ならネットワーク差分ですが、全員落ちているなら単純にリポジトリ障害のこともあります。
その場合は無理に直そうとせず、まず状況共有が早いです。

2) HTTPS/証明書(PKIX、SNI、TLS、社内CA)

次に多いのが証明書系です。
Gradleの依存取得は最終的にHTTPS通信なので、証明書が怪しいと一瞬で詰みます。

典型エラー

  • PKIX path building failed
  • unable to find valid certification path to requested target
  • handshake_failure / SSLHandshakeException

チェック1:Gradleが使っているJDKはどれ?

証明書は JDK の trust store に依存します。
つまり「どのJDKでGradleが動いているか」が超重要です。

  • Android StudioのGradle JVM
  • CIのJavaバージョン

ローカルはJDK 17、CIはJDK 11、みたいなズレがあると、証明書エラーが片方だけで出ます。

チェック2:社内CA(中間証明書)を使っている?

社内ネットワークでSSL検査(MITM)や独自CAを使っていると、外部mavenへのHTTPSが証明書エラーになります。
この場合、端末(ブラウザ)では開けても、Gradleでは落ちる、が起きがちです。

対策の方向性は大きく2つです。

  • 正しいCAをJDKのtrust storeに入れる(管理された手順で)
  • 社内ミラー(Nexus/Artifactory等)経由に寄せる

後者の方が運用は安定しますが、環境依存になります。

チェック3:TLSバージョン・SNIの相性

古い環境や特殊なプロキシでTLSのネゴが壊れることがあります。
この場合はJDK更新で直ることも多いです。
「証明書っぽいけど実はTLS」もあるので、JDKを揃えるのは早めが吉です。

3) プロキシ/VPN/フィルタ(社内ネットワーク)

次はネットワーク経路です。
プロキシやVPNが絡むと、「ある人だけ取れない」が起きやすい。

チェック1:Gradleがプロキシ設定を見ているか

プロキシ環境では、gradle.properties に proxy を設定しているケースがあります。
ただ、設定が古い/誤っていると逆に詰まります。

「会社のネットでだけ落ちる」「家だと通る」なら、ほぼここです。

チェック2:VPN/セキュリティソフトの影響

VPNがDNSや経路を変えて、mavenCentralへの到達が不安定になることがあります。
セキュリティソフトがHTTPS検査をしているケースも同様です。

切り分けとしては、

  • VPNを切って試す
  • 別ネットワーク(テザリング等)で試す

が強いです。これで通るなら、Gradle設定よりネットワーク要因が濃厚です。

チェック3:名前解決(DNS)が怪しい

依存取得の失敗が「タイムアウト」「UnknownHost」系なら、DNSや経路が怪しいです。
証明書より先にネットワークを疑います。

4) バージョン競合・解決戦略(BOM、依存ツリー)

ここまでで「取れない(通信できない)」が潰れると、次は「取れたけど解決できない」です。

典型症状

  • 依存のバージョンが噛み合わず解決不能
  • 同じgroupの別バージョンが衝突
  • BOMと直指定が混在して地獄

まずやる:依存ツリーを出す

./gradlew :app:dependencies

マルチモジュールなら、落ちているモジュール単位で出すのがコツです。

次にやる:BOMを使うものはBOMで揃える

FirebaseやComposeなど、BOM前提のものはBOMで揃えると解決が安定します。
直指定が混ざると、解決結果が想定とズレます。

最後にやる:resolutionStrategyで強制固定(最終手段)

強制固定は効きますが、隠れた不整合を生みます。
どうしても必要な時だけにして、後で正しく直す前提で使うのが現実的です。

5) キャッシュ破損・ミラー不整合(Gradleキャッシュ)

最後はキャッシュです。
依存取得が途中で壊れたり、ミラーが中途半端な状態を返してきたりすると、同じ依存が永遠に取れません。

まずは軽く:依存再取得

./gradlew --refresh-dependencies

次に:Gradleデーモン停止

./gradlew --stop

最後:~/.gradle/caches の削除(重い)

本当に最後です。再ダウンロードが走るので時間がかかります。

最短で原因に辿り着くための「調査の順番」

もう一度まとめます。迷ったらこの順番で。

  1. repositoriesの宣言場所と順番(settings/build)
  2. ネットワーク(別回線で通るか)
  3. 証明書(JDK差分、社内CA)
  4. 依存ツリー(競合/解決戦略)
  5. キャッシュ(refresh → caches削除)

「いきなり caches 削除」は気持ちは分かりますが、根本原因が残るので再発しやすいです。

デバッグ/確認チェックリスト

  • repositories の宣言場所(settings.gradle)を確認した
  • google/mavenCentral の順番が妥当
  • HTTPではなくHTTPSのURLになっている
  • 別ネットワークで試して差分を見た
  • Gradle JVM のJDKがローカル/CIで揃っている
  • 社内CA/SSL検査の有無を把握した
  • dependenciesタスクで競合を確認した
  • –refresh-dependencies を試した

よくある質問(Q&A)

Q. 会社のネットだけ取れないです

プロキシ/VPN/SSL検査の可能性が高いです。まず別回線(テザリング等)で通るか確認すると、切り分けが一気に進みます。

Q. PKIXって出たら何をすればいい?

まずGradleが使っているJDKを確認します。次に社内CAや中間証明書の問題を疑います。JDKが違うだけで片方だけ落ちることが多いです。

Q. –refresh-dependenciesでも直りません

キャッシュ破損が強いなら ~/.gradle/caches を消すのが手ですが、その前にネットワークと証明書の切り分けが終わっているか確認した方がいいです。根本が残ると再発します。

まとめ:依存が取れない時は「上から順に潰す」

  • まずmaven設定(宣言場所/順番)
  • 次にネットワークと証明書(JDK差分)
  • 最後に競合とキャッシュを潰す

迷ったら:別回線で試す → JDKを揃える。
この2つで原因が一気に絞れることが多いです。

コメント

タイトルとURLをコピーしました