pom.xmlとは?Maven初心者のための完全ガイド【基本から実践まで】

Java

Javaのプロジェクトを開いたら、必ず見かける「pom.xml」というファイル。エラーが出た時に「pom.xmlを確認してください」と言われることも多いけど、実際に何をするファイルなのか分からない。

中身を見ても、タグがたくさん並んでいて、どこを触っていいか分からない。でも、このファイルはJavaプロジェクトの心臓部とも言える重要なファイルなんです。

この記事では、pom.xmlとは何か、どんな役割を持っているのか、そしてどう使えば良いのかを、初心者の方にも分かりやすく解説します。プログラミングを始めたばかりの方でも理解できるよう、専門用語は最小限にして、実例を交えながら説明していきます。

pom.xmlを理解すれば、Javaプロジェクトの構造が見えてきますよ!

スポンサーリンク

pom.xmlとは?基本を理解しよう

まず、pom.xmlの正体を明らかにしましょう。

pom.xmlの正式名称

POM:Project Object Model(プロジェクト・オブジェクト・モデル)

簡単に言うと:

Javaプロジェクトの設定が書かれた「設計図」のようなファイルです。

pom.xmlの役割

役割1:プロジェクト情報の管理

プロジェクト名、バージョン、作成者などの基本情報を記録します。

役割2:依存関係の管理

プロジェクトで使うライブラリ(外部のプログラム)を指定します。

実例:

「このプロジェクトでは、Spring Frameworkのバージョン5.3.10を使います」という宣言ができます。

役割3:ビルド設定

プログラムをコンパイルして実行可能な形にする方法を定義します。

役割4:プラグインの設定

追加の機能(テスト実行、パッケージング、デプロイなど)を設定します。

Mavenとは

pom.xmlを理解する前に、Mavenについても知っておきましょう。

Maven(メイヴン):

Javaプロジェクトのビルド管理ツールです。

できること:

  • ライブラリの自動ダウンロード
  • プロジェクトのコンパイル
  • テストの実行
  • パッケージング(JARやWARファイルの作成)
  • ドキュメント生成

pom.xmlとの関係:

Mavenは、pom.xmlに書かれた設定を読み取って、上記の作業を自動で実行してくれます。

なぜpom.xmlが必要なのか

理由1:ライブラリ管理が楽になる

手動でライブラリをダウンロードして配置する必要がありません。pom.xmlに書くだけで自動的にダウンロードされます。

理由2:チーム開発が円滑に

メンバー全員が同じpom.xmlを使えば、全員が同じバージョンのライブラリを使うことが保証されます。

理由3:ビルドプロセスの標準化

どのマシンでも同じ手順でビルドできるようになります。

実例:

新しいメンバーがプロジェクトに参加しても、pom.xmlがあれば、すぐに開発環境を構築できます。

pom.xmlの基本構造

実際のpom.xmlの構造を見ていきましょう。

最もシンプルなpom.xml

<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
         http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myapp</artifactId>
    <version>1.0.0</version>

</project>

各要素の説明

<project>タグ:

すべてを囲む最も外側のタグです。XML名前空間の宣言が含まれます。

<modelVersion>

POMのモデルバージョンです。現在は「4.0.0」固定です。

<groupId>

プロジェクトを作成している組織や団体を表します。通常はドメイン名を逆にしたもの。

例:

  • com.google → Google製
  • org.springframework → Spring Framework
  • com.example → 練習用

<artifactId>

プロジェクトの名前です。このプロジェクト固有の識別子。

例:

  • myapp
  • user-service
  • shopping-cart

<version>

プロジェクトのバージョン番号です。

例:

  • 1.0.0 → 最初のリリース
  • 2.1.3 → メジャー2、マイナー1、パッチ3
  • 1.0-SNAPSHOT → 開発中バージョン

座標(Coordinates)の概念

Maven座標:

groupIdartifactIdversionの3つで、プロジェクトを一意に識別できます。

イメージ:

住所のようなものです。「東京都(groupId)、渋谷区(artifactId)、1丁目(version)」のように、場所を特定します。

依存関係(Dependencies)の管理

pom.xmlの最も重要な機能の一つです。

依存関係とは

説明:

プロジェクトで使う外部のライブラリ(他の人が作ったプログラム)のことです。

例:

  • データベース接続:MySQL Connector
  • JSON処理:Jackson
  • Webフレームワーク:Spring Boot

依存関係の書き方

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.0</version>
    </dependency>
</dependencies>

説明:

<dependencies>タグの中に、<dependency>タグで各ライブラリを指定します。

実際の例:よく使うライブラリ

Spring Boot:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.7.0</version>
</dependency>

JUnit(テストフレームワーク):

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

MySQL Driver:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

スコープ(scope)の指定

スコープとは:

その依存関係をどの段階で使うかを指定します。

主なスコープ:

compile(デフォルト):

すべての段階で使用。何も指定しなければこれ。

test:

テスト実行時のみ使用。

例:

<scope>test</scope>

provided:

コンパイル時は必要だが、実行時は環境側が提供してくれる。

例:

サーブレットAPIは、Tomcatなどのサーバーが提供します。

runtime:

コンパイル時は不要だが、実行時に必要。

例:

JDBCドライバー

プロジェクト情報の記述

プロジェクトの詳細情報を書く方法です。

基本情報

<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myapp</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>My Application</name>
    <description>A sample Java application</description>
    <url>https://example.com/myapp</url>

</project>

<packaging>

プロジェクトのパッケージ形式を指定します。

選択肢:

  • jar → 通常のJavaアプリケーション(デフォルト)
  • war → Webアプリケーション
  • pom → 親プロジェクト(設定のみ)

<name>

人間が読みやすいプロジェクト名。

<description>

プロジェクトの説明。

<url>

プロジェクトのWebサイトURL。

プロパティ(Properties)の定義

繰り返し使う値を変数のように定義できます。

<properties>
    <java.version>11</java.version>
    <spring.version>5.3.10</spring.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

使い方:

他の場所で ${spring.version} のように参照できます。

例:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
</dependency>

メリット:

バージョン番号を一箇所で管理できます。変更も一箇所で済みます。

ビルド設定

コンパイルやパッケージングの設定です。

基本的なビルド設定

<build>
    <sourceDirectory>src/main/java</sourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<sourceDirectory>

ソースコードが置かれているディレクトリを指定します。

<plugins>

ビルドプロセスで使うプラグインを定義します。

よく使うプラグイン

コンパイラプラグイン:

Javaのバージョンを指定します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>11</source>
        <target>11</target>
    </configuration>
</plugin>

Surefireプラグイン(テスト実行):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
</plugin>

JARプラグイン:

実行可能なJARファイルを作成します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.example.Main</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

実践的なpom.xmlの例

実際のプロジェクトで使うpom.xmlを見てみましょう。

Spring Bootアプリケーションの例

<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
         http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myapp</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>My Spring Boot App</name>
    <description>Sample Spring Boot Application</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
    </parent>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <!-- Spring Boot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- データベース -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- テスト -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-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>

親POMの活用

<parent>タグ:

親となるPOMを指定して、設定を継承できます。

メリット:

  • 共通設定を書かなくて済む
  • バージョン管理が楽になる
  • Spring Boot Starterではバージョンを省略できる

実例:

上記の例では、Spring Boot Starter Parentを親にしているため、dependenciesでバージョンを書かなくても自動的に適切なバージョンが選ばれます。

よくある編集作業

実際の開発でよく行う編集を紹介します。

作業1:ライブラリを追加する

手順:

  1. Maven Repositoryサイト(mvnrepository.com)でライブラリを検索
  2. 目的のライブラリを見つける
  3. バージョンを選択
  4. 「Maven」タブのコードをコピー
  5. pom.xmlの<dependencies>内に貼り付け

例:Lombokを追加:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

作業2:Javaバージョンを変更する

手順:

  1. <properties>セクションを探す
  2. <java.version>を変更
<properties>
    <java.version>17</java.version>
</properties>
  1. コンパイラプラグインの設定も確認
<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>17</source>
        <target>17</target>
    </configuration>
</plugin>

作業3:バージョンを更新する

プロジェクトのバージョン:

<version>1.0.0</version>

<version>1.1.0</version>

依存関係のバージョン:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.7.0</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.7.5</version>
</dependency>

作業4:不要な依存関係を削除する

使っていないライブラリは削除しましょう。

手順:

  1. 該当する<dependency>タグを探す
  2. タグごと削除
  3. 保存

注意:

削除後、プロジェクトがビルドできるか確認しましょう。

よくあるエラーと対処法

pom.xmlに関するトラブルシューティングです。

エラー1:依存関係が解決できない

エラーメッセージ例:

Could not resolve dependencies

原因:

  • 指定したライブラリが存在しない
  • バージョン番号が間違っている
  • ネットワーク接続の問題

対処法:

  1. Maven Repositoryで正しい座標を確認
  2. バージョン番号を再確認
  3. インターネット接続を確認
  4. Maven設定(settings.xml)のリポジトリ設定を確認

エラー2:親POMが見つからない

エラーメッセージ例:

Non-resolvable parent POM

原因:

指定した親POMがダウンロードできません。

対処法:

  1. <parent>セクションのgroupId、artifactId、versionを確認
  2. インターネット接続を確認
  3. Maven設定を確認

エラー3:プラグインのバージョンが見つからない

エラーメッセージ例:

Plugin not found

対処法:

プラグインのバージョンを明示的に指定します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
</plugin>

エラー4:XMLの構文エラー

エラーメッセージ例:

Non-parseable POM

原因:

XMLの書き方が間違っています。

よくあるミス:

  • 閉じタグを忘れている
  • タグの入れ子が正しくない
  • 特殊文字がエスケープされていない

対処法:

  1. IDEのエラー表示を確認
  2. XMLバリデーターで検証
  3. バックアップから復元

エラー5:文字コードの問題

症状:

日本語のコメントが文字化けする。

対処法:

プロパティで文字コードを指定します。

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Mavenコマンドとpom.xml

pom.xmlを使った実際のコマンド操作です。

基本的なMavenコマンド

依存関係をダウンロード:

mvn dependency:resolve

プロジェクトをコンパイル:

mvn compile

テストを実行:

mvn test

パッケージを作成(JARやWAR):

mvn package

クリーンビルド(一度削除してから再ビルド):

mvn clean install

IDEでの操作

IntelliJ IDEA:

  1. pom.xmlを右クリック
  2. 「Maven」→「Reload project」
  3. 変更が反映される

Eclipse:

  1. プロジェクトを右クリック
  2. 「Maven」→「Update Project」
  3. 「OK」をクリック

Visual Studio Code:

  1. コマンドパレット(Ctrl/Cmd + Shift + P)
  2. 「Maven: Reload Projects」を選択

ベストプラクティス

pom.xmlを書く時の推奨事項です。

1. バージョンはプロパティで管理

良い例:

<properties>
    <spring.version>5.3.10</spring.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
</dependencies>

2. 依存関係を整理する

コメントでグループ分けしましょう。

<dependencies>
    <!-- Spring Framework -->
    <dependency>...</dependency>

    <!-- Database -->
    <dependency>...</dependency>

    <!-- Testing -->
    <dependency>...</dependency>
</dependencies>

3. SNAPSHOTバージョンは本番で使わない

開発中:

<version>1.0-SNAPSHOT</version>

リリース時:

<version>1.0.0</version>

4. 推移的依存関係を理解する

推移的依存関係とは:

依存関係の依存関係も自動的に含まれます。

例:

Spring Web Starterを追加すると、Spring CoreやTomcatなども自動的に含まれます。

確認方法:

mvn dependency:tree

5. dependencyManagementで統一管理

複数のモジュールで同じライブラリを使う場合に便利です。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.7.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

まとめ:pom.xmlはJavaプロジェクトの設計図

pom.xmlについてまとめます。

pom.xmlとは:

Mavenプロジェクトの設定ファイル。プロジェクトの「設計図」のような存在。

主な役割:

  1. プロジェクト情報の管理(名前、バージョンなど)
  2. 依存関係の管理(使うライブラリの指定)
  3. ビルド設定(コンパイル方法など)
  4. プラグインの設定(追加機能)

基本構造:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>組織ID</groupId>
    <artifactId>プロジェクト名</artifactId>
    <version>バージョン</version>

    <dependencies>
        <!-- ライブラリの指定 -->
    </dependencies>

    <build>
        <!-- ビルド設定 -->
    </build>
</project>

重要な要素:

  • groupId, artifactId, version → Maven座標
  • dependencies → 使うライブラリ
  • properties → 共通の設定値
  • build → ビルドの設定
  • parent → 親POMの指定

よくある作業:

  • ライブラリの追加
  • Javaバージョンの変更
  • バージョンの更新
  • 不要な依存関係の削除

よくあるエラー:

  • 依存関係が解決できない → Maven Repositoryで確認
  • 親POMが見つからない → インターネット接続確認
  • XMLの構文エラー → タグの閉じ忘れ確認

ベストプラクティス:

  1. バージョンはプロパティで管理
  2. コメントで整理
  3. SNAPSHOTは開発用
  4. 推移的依存関係を理解
  5. dependencyManagementで統一

コメント

タイトルとURLをコピーしました