3秒でわかる
Maven プロジェクトの設定ファイル。使うライブラリや Java のバージョンを宣言しておくことで、誰の環境でも同じ内容のビルドを再現できます。
30秒図解
もう少し詳しく
どういうものか
pom.xml は、Maven でビルドする Java プロジェクトの中心にある設定ファイルです。プロジェクトの直下に置き、依存ライブラリ、Java のバージョン、使うプラグイン、生成する成果物の名前を XML で書きます。
ルート要素は 。その中の (組織を表す名前)、(プロジェクト名)、 の三つが座標となり、この組み合わせで世界中のライブラリを一意に指せます。依存を書くときも同じ三点セットで相手を指定します。
なぜ必要か
pom.xml が無かった時代は、必要な jar ファイルを手で集め、lib フォルダに置き、クラスパスを通す作業がありました。ライブラリはさらに別のライブラリを必要とするため、集め始めると芋づる式に増えます。
Maven は、宣言した依存が必要とする依存(推移的依存)まで自動でたどって取得します。新しく参加した人が git clone してビルドコマンドを一つ叩くだけで同じ環境が再現され、手順が口伝ではなくファイルとして残ります。
具体例
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>jp.harenohi</groupId>
<artifactId>coffee-order</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.4.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project># 依存がどう解決されたかを木構造で確認する
mvn dependency:<a href="/glossary/tree" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">tree</a>つまずきやすいところ
の指定ミスは症状が分かりにくい形で出ます。test スコープのライブラリを本体のコードから import すると、テスト時は通るのに実行時に NoClassDefFoundError で落ちます。コンパイルが通ったから大丈夫、とはならない箇所です。
同じライブラリの違うバージョンが別々の経路から要求されたときは、宣言の位置がより近いほうが採用されます。意図より古い版が選ばれて挙動が変わることがあるため、不可解な動きをしたら依存ツリーを出して確かめます。
コンパイラのバージョン指定の書き忘れも定番です。既定値が古いままだと、新しい文法を書いた瞬間に構文エラーになります。
似た用語との違い
| ファイル | ツール | 書き方 |
|---|---|---|
| pom.xml | Maven | XML。宣言的で読み方が一通り |
| build.gradle | Gradle | Groovy や Kotlin。処理も書ける |
| package.json | npm | JSON。JavaScript 側の同じ役割 |
覚え方
POM は Project Object Model の略です。プロジェクトそのものを一つのファイルで表した模型、と読むと が最上位にある構造が腑に落ちます。