1.

Maven 完全ガイド (pom.xml / ライフサイクル / プラグイン / リポジトリ)

編集
この記事の要点
  • Apache Maven = Java プロジェクトのビルド・依存管理・パッケージング標準ツール
  • pom.xml でプロジェクト情報・依存・ビルド設定を宣言的に記述
  • Maven Central Repository から数十万のライブラリを座標 (groupId/artifactId/version) で取得
  • ライフサイクル: validate → compile → test → package → verify → install → deploy
  • 代表コマンド mvn clean install = ローカルリポジトリ (~/.m2) に成果物を配置

Maven とは

Apache Maven は、Java プロジェクト向けのビルド管理・依存管理・プロジェクト管理を統合的に行うツールです。2004 年に Apache Software Foundation のトッププロジェクトとなって以降、Java エコシステムの事実上の標準として君臨してきました。pom.xml という XML ファイルでプロジェクトを宣言的に記述し、Maven Central という巨大な公開リポジトリからライブラリを自動取得する仕組みが革命的でした。

項目内容
初回リリース2004 年
開発元Apache Software Foundation
ライセンスApache License 2.0
最新バージョン (2025)Maven 3.9.x / 4.0.x
主な対象言語Java (Kotlin / Scala / Groovy も可)
競合Gradle / sbt / Ant + Ivy

pom.xml の基本構造

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>

    <!-- プロジェクト座標 (GAV) -->
    <groupId>com.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <!-- プロパティ -->
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!-- 依存ライブラリ -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.10.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- ビルド設定 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

ライフサイクルとフェーズ

Maven の標準ライフサイクルには 3 種類あります。最重要は default ライフサイクル:

フェーズ説明
validateプロジェクトが正しいか検証
compileソースコードをコンパイル
testユニットテスト実行 (Surefire)
packagejar / war にパッケージング
verify結合テスト (Failsafe)
installローカルリポジトリ (~/.m2) に配置
deployリモートリポジトリに公開

その他のライフサイクル:

  • cleantarget/ ディレクトリを削除
  • site — プロジェクトサイト (HTML) を生成

主要コマンド

# クリーン + ビルド + ローカルインストール (定番)
mvn clean install

# テスト省略してパッケージング
mvn clean package -DskipTests

# 特定モジュールのみビルド
mvn -pl module-name install

# 依存ツリーを表示
mvn dependency:tree

# 未使用依存を検出
mvn dependency:analyze

# プロジェクト情報サイト生成
mvn site

# Maven バージョン確認
mvn -v

# 並列ビルド (高速化)
mvn -T 4 clean install     # 4 スレッド
mvn -T 1C clean install    # CPU コア数 x1

# オフラインモード
mvn -o package

依存管理 (Dependency)

Maven の核心は推移的依存解決です。Spring Boot Web を入れるだけで、内部で必要な Tomcat / Jackson / Validation など 30 以上のライブラリが自動で揃います:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.2.0</version>
    <scope>compile</scope>    <!-- ★ scope -->
    <optional>false</optional>
</dependency>

scope の種類

scopeコンパイルテスト実行時パッケージ含む
compile (既定)OOOO
providedOOOX
runtimeXOOO
testXOXX
systemOOOX

Maven Central Repository

世界最大の Java ライブラリリポジトリ。座標 groupId:artifactId:version で一意に識別されます。検索は search.maven.orgmvnrepository.com で行います。

ローカルリポジトリ: ~/.m2/repository/
リモート (公式)   : https://repo.maven.apache.org/maven2/
ミラー候補       : Maven Central の各種ミラー

検索:
  https://mvnrepository.com  ← 一番便利
  https://search.maven.org

例:
  org.springframework.boot:spring-boot-starter-web:3.2.0
  → ~/.m2/repository/org/springframework/boot/spring-boot-starter-web/3.2.0/

settings.xml と認証

ユーザレベル設定は ~/.m2/settings.xml に書きます。社内 Nexus / Artifactory への接続情報など:

<settings>
  <servers>
    <server>
      <id>nexus-snapshots</id>
      <username>deploy</username>
      <password>${env.MAVEN_PASSWORD}</password>
    </server>
  </servers>

  <mirrors>
    <mirror>
      <id>internal-nexus</id>
      <mirrorOf>central</mirrorOf>
      <url>https://nexus.company.com/repository/maven-public/</url>
    </mirror>
  </mirrors>

  <profiles>
    <profile>
      <id>internal</id>
      <repositories>
        <repository>
          <id>internal-releases</id>
          <url>https://nexus.company.com/repository/maven-releases/</url>
        </repository>
      </repositories>
    </profile>
  </profiles>
</settings>

マルチモジュールプロジェクト

大規模プロジェクトでは親 POM + 複数子モジュール構成が定番:

my-project/
├── pom.xml           ← 親 (packaging=pom)
├── api/
│   └── pom.xml
├── core/
│   └── pom.xml
└── web/
    └── pom.xml
<!-- 親 pom.xml -->
<project>
    <groupId>com.example</groupId>
    <artifactId>my-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>api</module>
        <module>core</module>
        <module>web</module>
    </modules>

    <dependencyManagement>
        <!-- バージョンを 1 箇所で管理 -->
        <dependencies>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.16.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

<!-- 子モジュール pom.xml -->
<project>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>my-project</artifactId>
        <version>1.0.0</version>
    </parent>

    <artifactId>api</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <!-- version は親で管理されるので不要 -->
        </dependency>
    </dependencies>
</project>

主要プラグイン

プラグイン用途
maven-compiler-pluginコンパイル設定 (Java バージョン)
maven-surefire-pluginユニットテスト実行
maven-failsafe-plugin結合テスト実行
maven-shade-pluginFat JAR 作成 (全依存同梱)
spring-boot-maven-pluginSpring Boot 用 Fat JAR / Docker
jacoco-maven-pluginカバレッジ計測
versions-maven-plugin依存バージョン一括更新
maven-release-pluginリリースタグ作成・バージョン上げ

Maven Wrapper (mvnw)

プロジェクトに Maven 本体を同梱する仕組み。チームメンバが Maven をインストールしなくても使えます:

# Maven Wrapper の生成
mvn wrapper:wrapper

# 以後は ./mvnw を使う
./mvnw clean install
./mvnw spring-boot:run

# Windows
mvnw.cmd clean install

Gradle / sbt との比較

ツール記法速度柔軟性
MavenXML (宣言的)低 (制約強い)
GradleGroovy / Kotlin DSL高 (キャッシュ強力)
sbtScala DSL中 (Scala 専用)
Ant + IvyXML (手続き的)非常に高

選び方: 新規 Java プロジェクトなら Gradle がトレンド。既存 Java エンタープライズなら Maven が無難。

FAQ

Q: mvn installmvn deploy の違い
A: install はローカル ~/.m2 に配置するだけ。deploy は社内/公開 Maven リポジトリ (Nexus 等) にアップロード。

Q: 依存のバージョン衝突を解決したい
A: mvn dependency:tree -Dverbose で衝突を可視化。親 POM の dependencyManagement でバージョン固定するか、子で明示的に exclude。

Q: SNAPSHOT バージョンって何?
A: 開発中の不安定版。1.0.0-SNAPSHOT のように末尾に -SNAPSHOT を付けます。リリース時は SNAPSHOT を外します。

📸 参考画像

※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。

参考画像

編集
Post Share
子ページ
  1. ビルドする方法(eclipse)
  2. エラー一覧
  3. .m2フォルダの場所
  4. ローカル(サードパーティ製)のjarを追加する方法
同階層のページ

同階層のページはありません

最近更新/作成されたページ