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