できない.dev

Maven「there is no POM in this directory」の原因と直し方

there is no POM in this directory は、pom.xml のある場所で実行すれば直る。
Maven は実行したディレクトリの pom.xml しか見ないので、別の場所からは -f で pom.xml を指す。

公開:

要約

mvn compile や mvn package を実行すると、ビルドが始まる前に止まる。
Maven 3.10.0 では次の行が出る。

[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (/home/user/app). Please verify you invoked Maven from the correct directory. -> [Help 1]

there is no POM in this directory は、実行したディレクトリに pom.xml が無いという意味だ。compile や package のようなフェーズは、プロジェクトの設定である pom.xml を読んでから動くので、それが無いと何もできない。
括弧の中には Maven が探したディレクトリが出る。
まずここが、pom.xml を置いたディレクトリと同じかを見る。

Maven が見るのは、実行したディレクトリの pom.xml だけだ。
Maven 3.10.0 では、pom.xml のあるディレクトリの子(src の中)で実行しても、その親で実行しても、同じエラーになる。

解決策

1. pom.xml のあるディレクトリで実行する

ls pom.xml      # ここに無ければ実行している場所が違う
cd backend      # pom.xml のあるディレクトリへ移動する
mvn package

ファイル名が違うだけなら、pom.xml に直せば通る。

2. 移動せずに -f で POM を指す

スクリプトや CI でディレクトリを移動したくないときは、-f(--file)で POM の場所を渡す。CLI リファレンス(新しいタブで開く)のとおり、pom.xml そのものでも、それを含むディレクトリでもよい。

mvn -f backend/pom.xml package
mvn -f backend package

GitHub Actions なら、ステップの working-directory を pom.xml のあるディレクトリにしても同じことになる。

- run: mvn -B package
  working-directory: backend

3. 新しく作るなら archetype:generate の後に cd する

archetype:generate 自体は pom.xml の無い場所でも動く。
生成が終わったら、できたディレクトリへ入ってからビルドする(Maven in 5 Minutes(新しいタブで開く))。

mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5 -DinteractiveMode=false
cd my-app
mvn package

よくある原因

  1. 実行している場所が違う。
    モノレポのルートから実行した、ターミナルが src の中にいた、といった場合だ。
    Maven は親ディレクトリへさかのぼって pom.xml を探さない。
  2. archetype:generate の後に移動していない。mvn archetype:generate は、artifactId と同じ名前のディレクトリを作ってその中に pom.xml を置く。
    生成したディレクトリの外で続けて mvn package を打つと、このエラーになる。
  3. ファイル名が違う。
    Maven が既定で読むのは pom.xml という名前のファイルだけだ。pom.xml.txt のように拡張子が付いたものは見つからない。
    大文字小文字を区別するファイルシステム(Linux など)では Pom.xml も見つからない。
  4. CI の作業ディレクトリが違う。pom.xml がサブディレクトリにあるのに、ジョブはリポジトリのルートで mvn を実行している。