サンプルコードで身につける: Maven: pom.xml を1行ずつ読む
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1pom.xml の全文(start.spring.io の Maven 雛形、54行)
依存に web だけを選んだ雛形の です。強調した5〜10行目の が、版やの設定を継いでくる親 POM のです。 を空にしているので、 は手元の親フォルダを探さず、最初からへ取りに行きます。依存2本(33〜42行目)に version が無いこと、プラグイン(47〜50行目)にも version が無いことを確かめてください。
<?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=/bt/l4-pom/effective-pom.xml$ wc -l pom.xml /bt/l4-pom/effective-pom.xml54 pom.xml10541 /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 -40113: <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 /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.repositoriesspring-boot-dependencies-4.1.1.pomspring-boot-dependencies-4.1.1.pom.sha1/root/.m2/repository/org/springframework/boot/spring-boot-starter-parent/4.1.1/:_remote.repositoriesspring-boot-starter-parent-4.1.1.pomspring-boot-starter-parent-4.1.1.pom.sha1$ wc -l spring-boot-starter-parent-4.1.1.pom spring-boot-dependencies-4.1.1.pom387 .../spring-boot-starter-parent-4.1.1.pom3761 .../spring-boot-dependencies-4.1.1.pom$ grep -c "<dependency>" spring-boot-dependencies-4.1.1.pom652$ 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 -1274:[DEBUG] Populating class realm maven.api78:[DEBUG] Reading global settings from /usr/share/maven/conf/settings.xml79:[DEBUG] Reading user settings from /root/.m2/settings.xml82:[DEBUG] Using local repository at /root/.m2/repository86:[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 /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 で近いもの | 当たらない点-------------------------------+------------------------------+------------------------------------------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 と親に固定で書く