Java Maven入門:ビルド自動化と依存関係管理の基本

Java開発の世界へようこそ!多くのJavaプロジェクトでは、ライブラリの管理やビルドプロセスが複雑になりがちです。ここで登場するのが Apache Maven です。Mavenは、Javaプロジェクトのビルド自動化と依存関係管理を劇的に簡略化してくれる強力なツールです。この記事では、Mavenの基本的な概念から使い方まで、初心者にも分かりやすく解説していきます。さあ、Mavenの世界を探検しましょう!

Mavenは、Apache Software Foundationによって開発された、主にJavaプロジェクト向けのプロジェクト管理およびビルド自動化ツールです。2004年にバージョン1がリリースされ、その後改良が重ねられ、現在はバージョン3系が安定版として広く利用されており、バージョン4の開発も進んでいます。Maven登場以前は、Apache Antなどのツールが使われていましたが、設定が煩雑になりがちでした。Mavenは「設定より規約 (Convention over Configuration)」という思想に基づき、標準的なプロジェクト構造やライフサイクルを導入することで、設定を簡略化し、開発効率を向上させます。

Mavenが解決する主な課題は以下の2つです。

  • ビルドプロセスの標準化と自動化: コンパイル、テスト、パッケージング(JAR/WARファイルの作成)、デプロイといった一連のビルド作業を、簡単なコマンドで実行できるようにします。これにより、手作業によるミスを防ぎ、誰が実行しても同じ結果が得られる再現性の高いビルドを実現します。
  • 依存関係管理の簡略化: プロジェクトが必要とする外部ライブラリ(依存関係)を、設定ファイル(pom.xml)に記述するだけで、Mavenが自動的にダウンロードし、プロジェクトに追加してくれます。ライブラリのバージョン管理や、ライブラリがさらに依存している別のライブラリ(推移的依存関係)の解決も自動で行われるため、開発者はライブラリ管理の手間から解放されます。

これらの機能により、特に大規模なプロジェクトやチーム開発において、Mavenは非常に強力な助けとなります。プロジェクトの構造が標準化されるため、新しいメンバーもプロジェクトを理解しやすくなります。

Mavenを利用するには、まずお使いの環境にMavenをインストールする必要があります。最新の安定版は Maven 3.9.9 (2024年8月17日リリース) です。Maven 3.9以降を実行するには、JDK 8以上 が必要です。

2.1. ダウンロード

Apache Mavenの公式サイト から、最新版のバイナリ(Binary zip archive または Binary tar.gz archive)をダウンロードします。

2.2. インストール

  1. ダウンロードしたアーカイブファイルを、任意のディレクトリ(例: Windowsなら C:\tools、macOS/Linuxなら /usr/local~/tools など)に展開します。展開後のディレクトリ(例: apache-maven-3.9.9)がMavenのインストールディレクトリ(MAVEN_HOME)になります。
  2. 環境変数の設定:
    • MAVEN_HOME(またはM2_HOME): Mavenのインストールディレクトリを指定します。
    • PATH: %MAVEN_HOME%\bin (Windows) または $MAVEN_HOME/bin (macOS/Linux) を既存のPATHに追加します。

    Windowsでの設定例 (コマンドプロンプト):

    setx MAVEN_HOME "C:\tools\apache-maven-3.9.9" /M
    setx PATH "%MAVEN_HOME%\bin;%PATH%" /M

    管理者権限で実行する必要があります。設定後はコマンドプロンプトを再起動してください。

    macOS/Linuxでの設定例 (.bash_profile.zshrc など):

    export MAVEN_HOME=~/tools/apache-maven-3.9.9
    export PATH=$MAVEN_HOME/bin:$PATH

    設定ファイルを保存後、source ~/.bash_profilesource ~/.zshrc を実行するか、ターミナルを再起動してください。

2.3. 動作確認

コマンドプロンプトまたはターミナルを開き、以下のコマンドを実行します。Mavenのバージョン情報が表示されれば、インストールは成功です。

mvn -v

以下のような出力が表示されます(バージョン番号やJavaのバージョンは環境によって異なります)。

Apache Maven 3.9.9 (...)
Maven home: /path/to/apache-maven-3.9.9
Java version: 11.0.x, vendor: ..., runtime: ...
Default locale: ..., platform encoding: ...
OS name: "...", version: "...", arch: "...", family: "..."

2.4. (オプション) 設定ファイルのカスタマイズ

Mavenの全体的な設定は settings.xml ファイルで行います。このファイルは通常、以下の場所にあります。

  • グローバル設定: ${MAVEN_HOME}/conf/settings.xml (Mavenインストールディレクトリ内)
  • ユーザー設定: ${user.home}/.m2/settings.xml (ユーザーのホームディレクトリ配下の .m2 フォルダ内)

ユーザー設定ファイルはデフォルトでは存在しないため、必要に応じてグローバル設定ファイルをコピーして作成します。ユーザー設定はグローバル設定を上書きします。

settings.xml では、主に以下の設定を行います。

  • ローカルリポジトリの場所: Mavenがダウンロードしたライブラリなどを保存する場所。デフォルトは ${user.home}/.m2/repository ですが、変更したい場合は <localRepository> タグで指定します。
  • プロキシ設定: プロキシ環境下でMavenを使用する場合、<proxies> タグでプロキシサーバーの情報を設定します。
  • ミラーリポジトリ: Maven Central Repositoryへのアクセスが遅い場合や、組織内のリポジトリを使用する場合に、<mirrors> タグで代替リポジトリを指定します。

ローカルリポジトリ変更例 (settings.xml):

<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
  <localRepository>D:/path/to/your/local/repo</localRepository>
  ...
</settings>

Mavenを効果的に使うためには、いくつかの重要な概念を理解する必要があります。

3.1. POM (Project Object Model)

Mavenプロジェクトの中心となるのが pom.xml ファイルです。これはプロジェクトに関するあらゆる情報(プロジェクトの基本情報、依存関係、ビルド設定、プラグインなど)をXML形式で記述したものです。「プロジェクトオブジェクトモデル」という名前の通り、プロジェクトをオブジェクトとして捉え、その属性や構成を定義します。

pom.xml の主な要素を見てみましょう。

要素名 説明
<modelVersion> POMのバージョン。現在は通常 4.0.0 を指定します。 <modelVersion>4.0.0</modelVersion>
<groupId> プロジェクトを作成した組織やグループを識別するID。通常、逆ドメイン名形式(例: com.example)で指定します。 <groupId>com.example.myapp</groupId>
<artifactId> プロジェクト(成果物)固有のID。通常、プロジェクト名やモジュール名を指定します。groupIdartifactId の組み合わせでプロジェクトを一意に識別します。 <artifactId>my-app-core</artifactId>
<version> プロジェクトのバージョン。1.0.0, 1.0-SNAPSHOT のような形式で指定します。-SNAPSHOT は開発中のバージョンを示します。 <version>1.0.0</version>
<packaging> プロジェクトの成果物の形式。デフォルトは jar ですが、Webアプリケーションなら war、POM自体を配布する場合は pom などを指定します。 <packaging>jar</packaging>
<name> プロジェクトの人間可読な名前。 <name>My Application Core</name>
<description> プロジェクトの説明。 <description>Core module for my application.</description>
<properties> POM内で共通して利用する値を定義します。Javaのバージョンやライブラリのバージョンなどを定義することが多いです。${propertyName} 形式で参照できます。 <properties><java.version>11</java.version></properties>
<dependencies> プロジェクトが依存するライブラリ(依存関係)をリストします。詳細は後述します。 <dependencies>...</dependencies>
<dependencyManagement> 依存関係のバージョンを一元管理するためのセクション。マルチモジュールプロジェクトなどで役立ちます。ここでバージョンを指定しておくと、<dependencies> でバージョンを省略できます。 <dependencyManagement>...</dependencyManagement>
<build> ビルドに関する設定(ソースディレクトリ、出力ディレクトリ、使用するプラグインなど)を記述します。 <build>...</build>
<plugins> ビルド時に使用するMavenプラグインとその設定を記述します。<build> タグ内に記述します。 <plugins>...</plugins>
<reporting> プロジェクトレポート生成に関する設定(使用するレポートプラグインなど)を記述します。 <reporting>...</reporting>

基本的な pom.xml の例:

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

    <groupId>com.example</groupId>
    <artifactId>my-cool-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>My Cool Application</name>
    <description>A sample application to demonstrate Maven basics.</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <junit.version>5.9.1</junit.version> <!-- プロパティでバージョンを管理 -->
    </properties>

    <dependencies>
        <!-- JUnit 5 dependency -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version> <!-- プロパティ参照 -->
            <scope>test</scope> <!-- この依存関係はテスト時にのみ必要 -->
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Maven Compiler Plugin: Javaバージョンを指定 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version> <!-- プラグインのバージョンも指定推奨 -->
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <!-- Maven Surefire Plugin: テスト実行用 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M7</version>
            </plugin>
        </plugins>
    </build>
</project>

3.2. リポジトリ

Mavenは、プロジェクトの成果物(JARファイルなど)や依存関係ライブラリ、プラグインなどをリポジトリと呼ばれる場所に格納し、管理します。リポジトリには主に3つの種類があります。

  • ローカルリポジトリ:
    • 開発者のマシン上に存在するリポジトリ。
    • Mavenがリモートリポジトリからダウンロードした依存関係やプラグイン、ローカルでビルドしたプロジェクトの成果物(mvn install実行時)などがキャッシュとして保存されます。
    • デフォルトの場所はユーザーホームディレクトリ下の .m2/repository ですが、settings.xml で変更可能です。
    • 一度ダウンロードされたアーティファクトはローカルリポジトリに保存されるため、次回以降は高速にアクセスできます。
  • セントラルリポジトリ:
    • Mavenコミュニティによって提供・管理されている巨大な公開リモートリポジトリ (https://repo.maven.apache.org/maven2/)。
    • 世界中の多くのオープンソースライブラリがここに集められています。
    • Mavenはデフォルトでこのリポジトリを参照し、必要な依存関係をダウンロードします。
    • 通常、Maven Repository などの検索サイトを利用してライブラリを探します。
  • リモートリポジトリ:
    • セントラルリポジトリ以外の、ネットワーク上にあるリポジトリの総称。
    • 組織内で独自に構築したプライベートリポジトリ(例: Nexus Repository Manager, JFrog Artifactory)や、特定のベンダーが提供するリポジトリなどが含まれます。
    • pom.xml<repositories> タグや settings.xml<mirrors> タグで設定することで、Mavenがこれらのリポジトリを参照するようになります。

Mavenは、依存関係が必要になると、まずローカルリポジトリを探します。見つからない場合は、設定されているリモートリポジトリ(デフォルトではセントラルリポジトリ)にアクセスしてダウンロードし、ローカルリポジトリに保存します。

3.3. 依存関係管理 (Dependency Management)

Mavenの最も強力な機能の一つが依存関係管理です。pom.xml<dependencies> セクションに、プロジェクトが必要とするライブラリを記述するだけで、Mavenが自動的に解決してくれます。

<dependencies>
  <dependency>
    <groupId>org.apache.commons</groupId> <!-- ライブラリのグループID -->
    <artifactId>commons-lang3</artifactId> <!-- ライブラリのアーティファクトID -->
    <version>3.12.0</version> <!-- ライブラリのバージョン -->
    <scope>compile</scope> <!-- 依存関係のスコープ (省略可能、デフォルトはcompile) -->
  </dependency>
  <!-- 他の依存関係もここに追加 -->
</dependencies>

推移的依存関係 (Transitive Dependencies)

追加したライブラリがさらに別のライブラリに依存している場合、Mavenはその依存関係も自動的に解決し、ダウンロードしてくれます。これを推移的依存関係と呼びます。例えば、ライブラリAがライブラリBに依存し、ライブラリBがライブラリCに依存している場合、pom.xml にライブラリAを追加するだけで、BとCも自動的に利用可能になります。これにより、依存関係の記述を最小限に抑えることができます。

ただし、推移的依存関係によって意図しないバージョンのライブラリが導入されたり、バージョン競合が発生したりすることもあります。mvn dependency:tree コマンドで依存関係ツリーを確認し、競合が発生している場合は <dependencyManagement><exclusions> を使って解決します。

依存関係スコープ (Dependency Scope)

<scope> タグは、依存関係がどのビルドフェーズ(コンパイル、テスト、実行時など)で必要とされるか、また推移的依存関係に含めるかどうかを指定します。主なスコープには以下のものがあります。

スコープ 説明 推移的?
compile デフォルトのスコープ。コンパイル時、テスト時、実行時のすべてでクラスパスに含まれます。 はい
provided コンパイル時とテスト時には必要ですが、実行時にはJDKやコンテナ(例: Tomcat)によって提供されることを期待します。成果物(JAR/WAR)には含まれません。(例: Servlet API) いいえ
runtime 実行時とテスト時には必要ですが、コンパイル時には不要です。(例: JDBCドライバ) はい
test テストコードのコンパイル時とテスト実行時にのみ必要です。通常のコンパイルや実行時には含まれません。(例: JUnit, Mockito) いいえ
system provided に似ていますが、明示的にローカルシステムのJARファイルを指定する必要があります。リポジトリからは解決されません。ポータビリティが低くなるため、通常は使用を避けるべきです。<systemPath> の指定が必要です。 いいえ
import <dependencyManagement> セクションでのみ使用可能です。他のPOMファイル(通常はBOM – Bill of Materials)で定義された依存関係情報をインポートします。 いいえ

3.4. ビルドライフサイクル (Build Lifecycle)

Mavenは、プロジェクトのビルドプロセスをライフサイクルという概念で標準化しています。ライフサイクルは、フェーズ (Phase) と呼ばれる順序付けられたステップの集まりです。特定のフェーズを実行すると、そのフェーズに至るまでのすべてのフェーズが順番に実行されます。

Mavenには主に3つの組み込みライフサイクルがあります。

  • clean: ビルドによって生成されたファイル(通常 target ディレクトリ)を削除するためのライフサイクル。
  • default (または build): プロジェクトのビルド、テスト、パッケージング、デプロイを行う主要なライフサイクル。
  • site: プロジェクトに関するドキュメントやレポートを生成し、Webサイトを作成するためのライフサイクル。

Defaultライフサイクルの主要なフェーズ

最もよく使われる default ライフサイクルには多数のフェーズがありますが、特に重要なものを以下に示します。これらは順番に実行されます。

  1. validate: プロジェクトが正しく、必要な情報がすべて利用可能か検証します。
  2. compile: プロジェクトのソースコード (src/main/java) をコンパイルします。
  3. test: コンパイルされたコードに対して、適切なユニットテストフレームワーク (例: JUnit) を用いてテスト (src/test/java) を実行します。
  4. package: コンパイルされたコードとリソースを、配布可能な形式 (pom.xml<packaging> で指定された形式、例: JAR, WAR) にパッケージ化します。成果物は target ディレクトリに生成されます。
  5. verify: パッケージが有効であり、品質基準を満たしているかを確認するためのチェック(例: 統合テストの結果検証)を実行します。
  6. install: パッケージをローカルリポジトリにインストールします。これにより、他のローカルプロジェクトから依存関係として利用できるようになります。
  7. deploy: (通常はCI/CD環境で) 完成したパッケージをリモートリポジトリにコピーし、他の開発者やプロジェクトと共有できるようにします。

例えば、mvn package コマンドを実行すると、validate, compile, test を経て package フェーズまでが実行されます。同様に mvn install を実行すると、package までのフェーズに加えて install フェーズが実行されます。

Cleanライフサイクルのフェーズ

  • pre-clean: クリーン前処理。
  • clean: 前回のビルドで生成されたファイル (target ディレクトリ) を削除します。
  • post-clean: クリーン後処理。

mvn clean を実行すると、通常は clean フェーズが実行されます。

Siteライフサイクルのフェーズ

  • pre-site: サイト生成前処理。
  • site: プロジェクトのサイトドキュメント (target/site) を生成します。
  • post-site: サイト生成後処理。
  • site-deploy: 生成されたサイトを指定されたWebサーバーにデプロイします。

mvn site を実行すると、site フェーズまでが実行されます。

3.5. プラグイン (Plugins) と ゴール (Goals)

Mavenの実際の処理は、すべてプラグイン (Plugin) によって実行されます。Mavenコア自体はライフサイクル管理や依存関係解決などの基本的なフレームワークを提供するだけで、コンパイル、テスト、パッケージングといった具体的なタスクは、それぞれのプラグインが担当します。

各プラグインは、一つ以上のゴール (Goal) を持っています。ゴールは、特定のタスクを実行する単位です(例: コードをコンパイルするゴール、JARファイルを作成するゴール)。

Mavenのライフサイクルの各フェーズには、デフォルトで特定のプラグインのゴールが紐付けられています (バインディング)。例えば、compile フェーズには maven-compiler-plugincompile ゴールが、test フェーズには maven-surefire-plugintest ゴールが、package フェーズ (packagingがjarの場合) には maven-jar-pluginjar ゴールが紐付けられています。

mvn <phase> (例: mvn package) を実行すると、Mavenはそのフェーズおよびそれ以前のすべてのフェーズを実行し、各フェーズに紐付けられたゴールが順次実行されます。

また、ライフサイクルフェーズとは独立して、特定のプラグインのゴールを直接実行することも可能です。コマンドは mvn <plugin-prefix>:<goal> (または mvn <groupId>:<artifactId>[:<version>]:<goal>) の形式になります。

例:

  • mvn compiler:compile: maven-compiler-plugincompile ゴールのみを実行します(ライフサイクルの他のフェーズは実行されません)。
  • mvn dependency:tree: maven-dependency-plugintree ゴールを実行し、依存関係ツリーを表示します。

pom.xml<build><plugins> セクションで、使用するプラグインのバージョンを指定したり、デフォルトの動作をカスタマイズしたり、特定のフェーズに追加のゴールを紐付けたりすることができます。プラグインのバージョンを明示的に指定することは、ビルドの再現性を保つために非常に重要です。

代表的なMavenプラグイン:

プラグイン (artifactId)主なゴール説明
maven-clean-plugincleantarget ディレクトリを削除する (clean フェーズにバインド)
maven-compiler-plugincompile, testCompileソースコードとテストコードをコンパイルする (compile, test-compile フェーズにバインド)
maven-surefire-plugintestユニットテストを実行する (test フェーズにバインド)
maven-jar-pluginjarJARファイルを生成する (package フェーズにバインド)
maven-war-pluginwarWARファイルを生成する (package フェーズにバインド)
maven-install-plugininstall成果物をローカルリポジトリにインストールする (install フェーズにバインド)
maven-deploy-plugindeploy成果物をリモートリポジトリにデプロイする (deploy フェーズにバインド)
maven-resources-pluginresources, testResourcesリソースファイル (src/main/resources, src/test/resources) を処理・コピーする (process-resources, process-test-resources フェーズにバインド)
maven-site-pluginsite, deployプロジェクトサイトを生成・デプロイする (site, site-deploy フェーズにバインド)
maven-dependency-plugintree, analyze, etc.依存関係のツリー表示や分析などを行う (特定のフェーズには通常バインドされない)
maven-enforcer-pluginenforce環境(Mavenバージョン、JDKバージョンなど)や依存関係に関するルールを強制する (validate フェーズにバインドすることが多い)

Mavenの操作は、主にコマンドラインから mvn コマンドを使って行います。以下によく使われるコマンド(ライフサイクルフェーズの実行)を示します。

コマンド説明実行される主なフェーズ
mvn clean ビルド成果物 (target ディレクトリ) を削除します。 clean
mvn compile プロジェクトのソースコードをコンパイルします。結果は target/classes に出力されます。 validate, …, compile
mvn test ユニットテストを実行します。テスト結果は target/surefire-reports に出力されます。 validate, …, compile, …, test-compile, test
mvn package コンパイル、テストを実行し、プロジェクトをパッケージ化(例: JAR, WAR)します。成果物は target ディレクトリに生成されます。 validate, …, test, …, package
mvn verify パッケージング後、統合テストの実行や品質チェックなどを行います。 validate, …, package, …, verify
mvn install パッケージング後、成果物をローカルリポジトリ (~/.m2/repository) にインストールします。 validate, …, package, …, verify, install
mvn deploy ローカルリポジトリへのインストール後、成果物をリモートリポジトリにデプロイします (pom.xml にデプロイ先の設定が必要)。 validate, …, install, deploy
mvn site プロジェクトのサイトドキュメントを生成します。結果は target/site に出力されます。 (Siteライフサイクル) pre-site, site
mvn clean install clean ライフサイクルを実行してから install フェーズまでを実行します。よく使われる組み合わせです。 cleanvalidate, …, install

特定のプラグインゴールを実行するコマンドもあります。

コマンド説明
mvn dependency:tree プロジェクトの依存関係ツリーを表示します。推移的依存関係やバージョンの競合を確認するのに役立ちます。
mvn dependency:analyze 依存関係を分析し、未使用の依存関係や、pom.xml に直接宣言されていないが使用されている依存関係などを検出します。
mvn help:effective-pom 親POMや設定ファイル (settings.xml) などから継承・適用された最終的なPOMの内容を表示します。
mvn versions:display-dependency-updates (versions-maven-plugin が必要) 使用している依存関係に新しいバージョンがないかチェックします。

Mavenには、Archetype (アーキタイプ) というプロジェクトの雛形を作成する機能があります。これを使うと、標準的なディレクトリ構造や基本的な pom.xml を持つプロジェクトスケルトンを簡単に生成できます。

ここでは、最も基本的なJavaアプリケーションの雛形 (maven-archetype-quickstart) を使ってプロジェクトを作成してみましょう。

  1. コマンドの実行: コマンドプロンプトまたはターミナルを開き、プロジェクトを作成したいディレクトリに移動して、以下のコマンドを実行します。
    mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
    • -DgroupId=com.example: 作成するプロジェクトのグループIDを指定します。
    • -DartifactId=my-app: 作成するプロジェクトのアーティファクトIDを指定します。これがプロジェクトのディレクトリ名にもなります。
    • -DarchetypeArtifactId=maven-archetype-quickstart: 使用するアーキタイプのアーティファクトIDを指定します。
    • -DarchetypeVersion=1.4: 使用するアーキタイプのバージョンを指定します。
    • -DinteractiveMode=false: 対話モードを無効にし、すべての情報をコマンドライン引数で指定します。これを省略すると、対話形式で情報を入力できます。
  2. 生成結果の確認: コマンドが成功すると、カレントディレクトリに my-app という名前のディレクトリが作成されます。その中身は以下のようになっているはずです。
    my-app/
    ├── pom.xml           # プロジェクトのPOMファイル
    └── src/
        ├── main/
        │   └── java/
        │       └── com/
        │           └── example/
        │               └── App.java  # サンプルのメインクラス
        └── test/
            └── java/
                └── com/
                    └── example/
                        └── AppTest.java # サンプルのテストクラス

    pom.xml には基本的な設定が記述されており、App.java には簡単な “Hello World!” プログラム、AppTest.java にはJUnitを使った簡単なテストコードが含まれています。

  3. ビルドと実行: 作成されたプロジェクトディレクトリに移動し、Mavenコマンドを試してみましょう。
    cd my-app
    mvn package

    これにより、コンパイル、テスト、パッケージングが実行され、target ディレクトリ内に my-app-1.0-SNAPSHOT.jar のようなJARファイルが生成されます。

    生成されたJARファイルを実行するには、次のようにします。

    java -cp target/my-app-1.0-SNAPSHOT.jar com.example.App

    コンソールに “Hello World!” と表示されるはずです。

このように、Archetypeを使えば、標準的な構造を持つMavenプロジェクトを素早く立ち上げることができます。Webアプリケーション用の maven-archetype-webapp など、様々な種類のArchetypeが用意されています。

Apache Mavenは、Java開発におけるビルドの自動化と依存関係管理を効率化するための強力なツールです。その主なメリットを再確認しましょう。

  • ビルドプロセスの標準化・自動化: mvn コマンド一つでコンパイルからデプロイまでの一連のプロセスを実行でき、開発効率が向上します。
  • 簡単な依存関係管理: pom.xml に記述するだけで、必要なライブラリを自動でダウンロード・管理してくれます。推移的依存関係も解決されるため、手作業でのライブラリ管理の手間が大幅に削減されます。
  • プロジェクト構造の標準化: 規約に基づいたディレクトリ構造により、プロジェクトの見通しが良くなり、チーム開発が容易になります。
  • 豊富なプラグインエコシステム: 様々なプラグインを利用することで、ビルドプロセスの拡張やカスタマイズが容易に行えます。
  • 情報の集約: プロジェクトに関する情報が pom.xml に集約されるため、管理がしやすくなります。

Mavenを使いこなすことで、Javaプロジェクトの開発プロセスをよりスムーズに、より効率的に進めることができます。最初は覚えることが多いかもしれませんが、基本的な概念とコマンドを理解すれば、その恩恵を十分に受けることができるでしょう。

次のステップとしては、マルチモジュールプロジェクトの管理、プロファイルを使った環境ごとの設定切り替え、カスタムプラグインの開発などに挑戦してみるのも良いでしょう。Happy Maving!