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