できない.dev

Maven「Could not find artifact」の原因と直し方

Could not find artifact は、依存の groupId・artifactId・version を実在するものに直せば解消する。
直した後も This failure was cached と出るなら、-U を付けて取り直させる。

公開:

要約

依存ライブラリを取りに行ったが、どのリポジトリにも見つからなかったときのエラーだ。
Maven 3.10.0 で、存在しないバージョン 99.0-jre の Guava を依存に書くと次のように出る。

[WARNING] The POM for com.google.guava:guava:jar:99.0-jre is missing, no dependency information available
[ERROR] Failed to execute goal on project demo: Could not resolve dependencies for project com.example:demo:jar:1.0
[ERROR] dependency: com.google.guava:guava:jar:99.0-jre (compile)
[ERROR]     Could not find artifact com.google.guava:guava:jar:99.0-jre in central (https://repo.maven.apache.org/maven2)

Could not find artifact の後ろには、探した依存の座標(groupId:artifactId:jar:version)と、探しに行ったリポジトリの ID と URL が続く。
この 2 つで、「座標が間違っている」のか「探しに行く先が違う」のかを切り分ける。

同じビルドをもう一度実行すると、メッセージが変わる。

[ERROR]     com.google.guava:guava:jar:99.0-jre was not found in https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced

前回の失敗がローカルリポジトリ(~/.m2/repository)に記録されていて、Maven がリポジトリに問い合わせずに失敗を返した、という意味だ。
座標や設定を直した後でもこの行が出るのは、記録が残っているためである。

解決策

1. 座標を実在するものに直す

ライブラリの公式ドキュメントにある依存の書き方か、Maven Central の検索で、groupId・artifactId・version の組を確かめて書き直す。

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>33.4.0-jre</version>
</dependency>

2. 取得元のリポジトリを足す

Central 以外から取るライブラリは、pom.xml の <repositories> に取得元を書く。~/.m2/settings.xml のプロファイルに書く方法もある(Setting up Multiple Repositories(新しいタブで開く))。

<repositories>
  <repository>
    <id>company</id>
    <url>https://repo.example.com/maven2</url>
  </repository>
</repositories>

mirror を使っているなら、エラーの URL が社内リポジトリかを先に見る。
そうなら、そのリポジトリにライブラリを入れてもらう。

3. 失敗の記録を無視して取り直させる

直したのに This failure was cached が出るなら、-U を付けて実行する。CLI リファレンス(新しいタブで開く)では、-U は見つからなかったリリースと更新されたスナップショットを、リモートリポジトリへ確かめ直すオプションだ。
Maven 3.10 では、成果物だけを取り直す -UA も使える。

mvn -U package

記録の実体は、~/.m2/repository の該当バージョンのディレクトリにできる *.lastUpdated ファイルで、これを消しても次の実行で取りに行く。
どのくらいの間隔で確かめ直すかはリポジトリの updatePolicy で決まり、既定は daily(1 日 1 回)である(POM Reference(新しいタブで開く))。

よくある原因

  1. バージョンが実在しない。
    打ち間違いや、まだ公開されていないバージョンを書いている。
    最初の The POM for ... is missing の警告も、その座標が無いことを示す。
  2. groupId か artifactId が違う。
    1 文字違うだけで、別の依存として探しに行く。
  3. 取得元のリポジトリを書いていない。
    何も書かなければ、探しに行くのは Maven Central(ID は central)だけだ。
    社内リポジトリや Central 以外で配布されているライブラリは、取得元を足さないと見つからない。
  4. mirror の向き先にライブラリが無い。settings.xml の <mirror> で取得先を社内リポジトリへ向けていると、エラーの in の後ろはその mirror の ID と URL になる。
    そこにライブラリが無ければ見つからない。
  5. 失敗の記録が残っている。
    上の 2 つ目のメッセージが出る状態で、記録の期限が切れるまで Maven は取りに行かない。