Dev Study
← 解説「Maven: pom.xml を1行ずつ読む」に戻る

サンプルコードで身につける: Maven: pom.xml を1行ずつ読む

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1pom.xml の全文(start.spring.io の Maven 雛形、54行)

依存に web だけを選んだ雛形の です。強調した5〜10行目の が、版やの設定を継いでくる親 POM のです。 を空にしているので、 は手元の親フォルダを探さず、最初からへ取りに行きます。依存2本(33〜42行目)に version が無いこと、プラグイン(47〜50行目)にも version が無いことを確かめてください。

pom.xml(Spring Boot 4.1.1 の雛形。タブを空白2つに展開)設定ファイル
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.1.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description/>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>25</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
 
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
 
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
 
</project>
 

2help:effective-pom で、継いだ結果を見る

親から継いだ値をすべて合成した を出力します。54行が 10,541 行になり、 の中の dependency は 1,911 本でした。自分の依存は2本のままですが、強調した行のとおり version と scope が補われています。sourceDirectory や outputDirectory、central の URL も、自分では書いていないのにここに現れ、 は java.version の 25 に置き換わっています。

$ mvn -q help:effective-pom -Doutput=effective-pom.xml(抜粋)コマンド出力
$ mvn -q help:effective-pom -Doutput=/bt/l4-pom/effective-pom.xml
$ wc -l pom.xml /bt/l4-pom/effective-pom.xml
54 pom.xml
10541 /bt/l4-pom/effective-pom.xml
# dependencyManagement の中の <dependency>: 1911 本 / dependencies の中: 2 本
 
$ grep -n "<packaging>\|<sourceDirectory>\|<outputDirectory>\|<testSourceDirectory>\|<directory>\|<finalName>\|<java.version>\|<maven.compiler\|<project.build.sourceEncoding>\|<resource.delimiter>\|<url>https://repo.maven.apache.org/maven2</url>" /bt/l4-pom/effective-pom.xml | head -40
113: <java.version>25</java.version>
146: <maven-compiler-plugin.version>3.15.0</maven-compiler-plugin.version>
161: <maven.compiler.release>25</maven.compiler.release>
177: <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
199: <resource.delimiter>@</resource.delimiter>
9922: <url>https://repo.maven.apache.org/maven2</url>
9932: <url>https://repo.maven.apache.org/maven2</url>
9936: <sourceDirectory>/bt/l4-pom/demo/src/main/java</sourceDirectory>
9938: <testSourceDirectory>/bt/l4-pom/demo/src/test/java</testSourceDirectory>
9939: <outputDirectory>/bt/l4-pom/demo/target/classes</outputDirectory>
...
9965: <directory>/bt/l4-pom/demo/target</directory>
9966: <finalName>demo-0.0.1-SNAPSHOT</finalName>
...
# <packaging> の行は1本も出ない(既定の jar は省略される)
 
# 自分の依存(effective-pom 9901〜9914 行): 版とスコープが補われている
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
<version>4.1.1</version>
<scope>compile</scope>
</dependency>
 
# spring-boot-maven-plugin(effective-pom 10321〜10335 行): 親が足した execution
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>4.1.1</version>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
...
 

3親の連鎖: starter-parent → spring-boot-dependencies → Super POM

親 POM はに .pom として置かれています。 は 387 行で、強調した5行の を持ちます。java.version は 17 で、雛形はこれを 25 で上書きしています。maven.compiler.release が ${java.version} を参照しているので、java.version を変えるだけでコンパイル対象の版が変わります。その親の は 3,761 行で、dependency が 652 本あります。

$ ls ~/.m2/repository/org/springframework/boot/{spring-boot-starter-parent,spring-boot-dependencies}/4.1.1/ ほかコマンド出力
$ ls /root/.m2/repository/org/springframework/boot/spring-boot-starter-parent/4.1.1/ /root/.m2/repository/org/springframework/boot/spring-boot-dependencies/4.1.1/
/root/.m2/repository/org/springframework/boot/spring-boot-dependencies/4.1.1/:
_remote.repositories
spring-boot-dependencies-4.1.1.pom
spring-boot-dependencies-4.1.1.pom.sha1
 
/root/.m2/repository/org/springframework/boot/spring-boot-starter-parent/4.1.1/:
_remote.repositories
spring-boot-starter-parent-4.1.1.pom
spring-boot-starter-parent-4.1.1.pom.sha1
 
$ wc -l spring-boot-starter-parent-4.1.1.pom spring-boot-dependencies-4.1.1.pom
387 .../spring-boot-starter-parent-4.1.1.pom
3761 .../spring-boot-dependencies-4.1.1.pom
$ grep -c "<dependency>" spring-boot-dependencies-4.1.1.pom
652
 
$ sed -n 14,18p spring-boot-starter-parent-4.1.1.pom
<java.version>17</java.version>
<resource.delimiter>@</resource.delimiter>
<maven.compiler.release>${java.version}</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 
# -X(デバッグ出力)で見える、親をたどった痕跡
$ mvn -B -ntp -X validate | grep -n -i 'Reading global settings\|Reading user settings\|Using local repository\|Extension realms\|Populating class realm\|Included: org.apache.maven.plugins' | head -12
74:[DEBUG] Populating class realm maven.api
78:[DEBUG] Reading global settings from /usr/share/maven/conf/settings.xml
79:[DEBUG] Reading user settings from /root/.m2/settings.xml
82:[DEBUG] Using local repository at /root/.m2/repository
86:[DEBUG] Extension realms for project com.example:demo:jar:0.0.1-SNAPSHOT: (none)
88:[DEBUG] Extension realms for project org.springframework.boot:spring-boot-starter-parent:pom:4.1.1: (none)
90:[DEBUG] Extension realms for project org.springframework.boot:spring-boot-dependencies:pom:4.1.1: (none)
 

4うまくいかない場合: modelVersion を変える

を 3.0.0 に書き換えると、Maven は読み込みの段階で止まります。エラー文に「このバージョンの Maven が対応するのは [4.0.0]」とあるとおり、Maven 3 系(ここでは 3.9.16)で使える POM の書式の版は 4.0.0 だけです(POM Reference も currently the only supported と版を限っています)。比較のため、正しい pom で を実行したときの出力も載せました。ヘッダの [ ] が、書いていない の既定値です。

$ mvn -f pom-bad.xml validate(modelVersion を 3.0.0 に)/ $ mvn validateコマンド出力
$ mvn -f /tmp/pom-bad.xml validate
[FATAL] 'modelVersion' of '3.0.0' is older than the versions supported by this version of Maven: [4.0.0]. Building this project requires an older version of Maven. @ line 4, column 16
 
$ mvn validate
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------------< com.example:demo >--------------------------
[INFO] Building demo 0.0.1-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.103 s
[INFO] Finished at: 2026-10-03T00:26:27Z
[INFO] ------------------------------------------------------------------------
 

5package.json との対応表: 当たる欄と当たらない欄

pom.xml の各要素を package.json に当てはめた表です。名前・版・依存までは対応しますが、scripts に当たる欄は無く、parent や dependencyManagement に当たるものは package.json にありません。逆に、node_modules のようにプロジェクトの中に依存が置かれることもありません。

pom.xml の要素と package.json の対応(当たらない点つき)表
pom.xml の要素 | package.json で近いもの | 当たらない点
-------------------------------+------------------------------+------------------------------------------
modelVersion 4.0.0 | (無し) | 書式の版。Maven 3.9.16 では 4.0.0 だけが使える
parent | (無し) | 親 POM を継承する。版やプラグインの設定が来る
groupId / artifactId / version | name / version | 3つ組でリポジトリ内の場所が決まる(groupId と version は親から継げる)
name / description / url | name / description | ビルドには影響しない説明用の欄
properties | (無し) | ${X} で参照する値の置き場。親の値を上書きできる
dependencies / dependency | dependencies | version を省ける(親の dependencyManagement が決める)
dependency の scope test | devDependencies | provided・runtime・import に当たるものは通常無い
build / plugins | (無し。scripts が一部近い) | 手順は書かない。使うプラグインとその設定を書く
packaging(省略時 jar) | (無し) | 成果物の種類。war にすると割り当てが変わる
(無し) | scripts | 手順の名前と中身を自分で書く欄は pom に無い
(無し) | package-lock.json | 対応するファイルは雛形に無い。版は pom と親に固定で書く
 

図やコードに出てくる用語(タップで説明)