Maven Getting Started Guide 導入編

Mavenの公式サイトの Getting Started Guide をかいつまんで適当に訳したものです・

Mavenとは

Mavenはプロジェクトのビルドプロセスのベストプラクティスを提供します。ビルドプロセスの一貫した基盤を提供することで、理解を用意にし、生産性を確保します。Mavenは基本的にプロジェクトマネジメントと理解のためのツールであり、以下の管理手段を提供します。

  • ビルド
  • ドキュメンテーション
  • 各種レポートティング
  • 依存性管理
  • SCM
  • リリース
  • 配布

開発プロセスにどのようにMavenを適用するか

Mavenは標準的な慣例とプラクティスを提供します。これにより、あなたの開発サイクルは加速し、成功への道は近くなるでしょう。それでは早速Mavenを使えるように、実際の例に入っていきましょう。

Mavenのダウンロードとインストール

Maven は以下のサイトからダウンロードできます。
http://maven.apache.org/download.html

MavenJavaツールなので、Javaが実行できる環境が整っている必要があります。この時、Java Runtime Environment(JRE)ではなく、Java Development KitJDK)が必要となります。以下にプラットフォーム毎の手順を示します。

Windows 2000/XP
  1. ダウンロードしたファイルを展開します。ここでは、C:\Program Files\Apache Software Foundationを展開先としたものとします。このディレクトリの中に apache-maven-2.X というサブディレクトリが作成されることになるでしょう。
  2. M2_HOME 環境変数を追加します。WinKey + Pause キーにて「システムのプロパティ」を開き、「詳細設定」-「環境変数」と選択し、ユーザ環境変数として M2_HOME 変数を追加します。ここでの例だと「C:\Program Files\Apache Software Foundation\apache-maven-2.X」となります。
  3. 同じダイアログにて M2 環境変数を「%M2_HOME%bin」として登録します。
  4. 同じダイアログにて、必要に応じて MAVEN_OPTS 環境変数を追加することができます。例えばJVMオプションとして「-Xms256m -Xmx512m」などを指定することができます。
  5. 同じダイアログにて PATH 環境変数を更新または存在しない場合は作成します。値として「%M2%」を追加してコマンドラインからMavenを使用できるようにします。
  6. JAVA_HOME 環境変数JDKのパスとして登録されていること、PATHとして「%JAVA_HOME%bin」として登録されていることを確認します。
  7. Winkey + R キーを押し、cmd と入力してコマンドプロンプトを開き、mvn --version を実行してバージョンが表示されることを確認します。
Unix系OS(Linux, Solaris and Mac OS X)
  1. ダウンロードしたファイルをMavenをインストールしたいディレクトリに展開します。ここでは、/usr/local/apache-mavenを展開先としたものとします。この場合 apache-maven-2.X というサブディレクトリが作成されることになるでしょう。
  2. コマンドターミナルにて M2_HOME 環境変数を追加します。export M2_HOME=/usr/local/apache-maven/apache-maven-2.X のようになります。
  3. 同様に、M2 環境変数を export M2=$M2_HOME/bin のように追加します。
  4. 必要に応じて MAVEN_OPTS 環境変数を追加することができます。例えばJVMオプションとして「-Xms256m -Xmx512m」などを指定することができます。この場合は export MAVEN_OPTS="-Xms256m -Xmx512m"のように指定します。
  5. M2 環境変数をパスに追加します。export PATH=$M2:$PATH のようになります。
  6. JAVA_HOME 環境変数JDKのパスとして登録されていること、PATHとして「%JAVA_HOME%bin」として登録されていることを確認します。
  7. mvn --version を実行してバージョン番号が表示されることを確認します。

Mavenの設定

通常はMavenのデフォルト設定で十分ですが、キャッシュの保存先を変更する場合や、HTTPプロキシの背後にいる場合は設定を行う必要があります。これらの設定については後述します。

はじめてのMavenプロジェクトの作成

Mavenでプロジェクトを作成するために、Mavenの提供する archetype メカニズムを使用しましょう。Mavenにおいて、archetype はプロジェクトのテンプレートです。いくつかのユーザ入力によりMavenが扱うプロジェクトのひな形を作成できます。
ここではarchetypeメカニズムが実際にどのようなものかを見ていきます。Mavenにて簡単なプロジェクトを作成するために、コマンドラインから以下を実行してください。

mvn archetype:create \
  -DarchetypeGroupId=org.apache.maven.archetypes \
  -DgroupId=com.mycompany.app \
  -DartifactId=my-app

このコマンドを実行すると、いくつかの事が行われます。1つ目に、my-app というプロジェクトディレクトリが作成されます。そしてこのディレクトリの中には 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.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

pom.xml ファイルは対象プロジェクトの Project Object Model (POM) を含んでいます。POMはMavenの動作の基本単位となり、Maven はプロジェクトの概念を中心に動作すため、POMを理解することが重要となります。つまりPOMにはプロジェクトに関するすべての情報が管理されることになります。POMの中身を見ていきましょう。

  • project:全ての Maven の pom.xml ファイルのトップレベル要素です
  • modelVersion:このPOMが使用するオブジェクトモデルのバージョンです。この値を変更することは稀ですが、モデルバージョンを明示的に指定するようにします。
  • groupId:この要素はプロジェクトを作成した組織やグループの一意識別子であり、通常は組織の完全修飾ドメイン名となります。例えばMavenプラグインのための groupId は org.apache.maven.plugins となります。
  • artifactId:この要素はこのプロジェクトの成果物の一意名を指定します。通常はJARファイル名となります。またソースバンドルのような成果物名としても使用します。典型的な成果物名は -. となり、例えば myapp-1.0.jar のような形式となります。
  • packaging:この要素は JAR, WAR, EAR のような成果物で使われるパッケージングを指定します。Mavenでは、ここに挙げた JAR, WAR, や EAR といったもの以外にもビルドプロセスのライフサイクルを扱うことができます。デフォルトのパッケージングは JAR となります。
  • version:この要素はプロジェクト成果物のバージョンを指定します。Maven はこのバージョンを元にバージョン管理を行います。SNAPSHOT という識別子を持つバージョンは開発中のバージョンを表します。スナップショットの扱いかたについては後述します。-name:この要素はプロジェクトの名前を指定します。Mavenの作成するドキュメントで使用されます。
  • url:この要素はプロジェクトのサイト用のURLを指定します。Mavenの作成するドキュメントで使用されます。
  • description:この要素はプロジェクトの説明の記述を指定します。Mavenの作成するドキュメントで使用されます。


POMに関するより詳細な情報は以下から得ることができます。
http://maven.apache.org/ref/2.0.8/maven-model/maven.html

続いて archetype:create コマンドにより作成されたプロジェクトのディレクトリ構成について見ていきます。

my-app
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- com
    |           `-- mycompany
    |               `-- app
    |                   `-- App.java
    `-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- app
                        `-- AppTest.java

プロジェクトディレクトリの直下にPOMがあり、アプリケーションソースとテストソースのディレクトリ階層があります。このレイアウトはMavenの標準的な構造となります。

アプリケーションソースのコンパイル方法

アプリケーションソースのコンパイルは非常に簡単です。pom.xmlの存在するディレクトリにて以下のコマンドを実行するだけです。

mvn compile

以下のような出力が得られます。

[INFO] ----------------------------------------------------------------------------
[INFO] Building Maven Quick Start Archetype
[INFO]    task-segment: [compile]
[INFO] ----------------------------------------------------------------------------
[INFO] artifact org.apache.maven.plugins:maven-resources-plugin: \
  checking for updates from central
...
[INFO] artifact org.apache.maven.plugins:maven-compiler-plugin: \
  checking for updates from central
...
[INFO] [resources:resources]
...
[INFO] [compiler:compile]
Compiling 1 source file to <dir>/my-app/target/classes
[INFO] ----------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ----------------------------------------------------------------------------
[INFO] Total time: 3 minutes 54 seconds
[INFO] Finished at: Fri Sep 23 15:48:34 GMT-05:00 2005
[INFO] Final Memory: 2M/6M
[INFO] ----------------------------------------------------------------------------

このコマンドの初回実行時には、Mavenは必要なプラグインや依存関係で必要なものをダウンロードするため時間がかかります。次回実行時からはダウンロードは必要なくなるため処理は早く終了します。

このコマンドの実行にて ${basedir}/target/classes にコンパイルしたクラスファイルが出力されます。この出力ファイルのレイアウトもまたMavenの標準的なレイアウトです。
Maven が行うこれらの仕事を考えると、POMが非常に簡素であることに気付くでしょう。これはMavenが標準的な規約を持っており、ユーザが指定する内容が少なく抑えられているためです。

テストソースのコンパイルとテストの実行

アプリケーションソースのコンパイルが終了したので、単体テストの実行に取りかかりましょう。以下のコマンドを実行してください。

mvn test

以下のような出力が得られるはずです。

[INFO] ----------------------------------------------------------------------------
[INFO] Building Maven Quick Start Archetype
[INFO]    task-segment: [test]
[INFO] ----------------------------------------------------------------------------
[INFO] artifact org.apache.maven.plugins:maven-surefire-plugin: \
  checking for updates from central
...
[INFO] [resources:resources]
[INFO] [compiler:compile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources]
[INFO] [compiler:testCompile]
Compiling 1 source file to C:\Test\Maven2\test\my-app\target\test-classes
...
[INFO] [surefire:test]
[INFO] Setting reports dir: C:\Test\Maven2\test\my-app\target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
[surefire] Running com.mycompany.app.AppTest
[surefire] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0 sec

Results :
[surefire] Tests run: 1, Failures: 0, Errors: 0

[INFO] ----------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ----------------------------------------------------------------------------
[INFO] Total time: 15 seconds
[INFO] Finished at: Thu Oct 06 08:12:17 MDT 2005
[INFO] Final Memory: 2M/8M
[INFO] ----------------------------------------------------------------------------

この出力で注意して見るべき箇所を以下に示します。

  • 今回も Maven は依存関係によるダウンロードを行っています。これはテストに必要なプラグインのダウンロードで、次回実行時には省略されます
  • アプリケーションのコードに修正を実施していませんが、テストコードのコンパイルの前にアプリケーションコードのコンパイルが実施されています。

もしテストコードのコンパイルだけを実施したい場合は以下のコマンドを実行します(テストの実行は行われません)。

mvn test-compile

JARファイルの作成とローカルリポジトリへのインストール

JARファイルの作成は以下のコマンドを実行します。

mvn package

POMの定義を見ると、packaging 要素の定義が jar となっていることが確認できるでしょう。これにより Maven は、このコマンドにより JAR ファイルを作成すべきだということを認識します(これに関しては後述します)。${basedir}/target ディレクトリにJARファイルが作成されていることでしょう。

作成されたJARファイルをローカルリポジトリ(~/.m2/repository がデフォルトのロケーションです)にインストールしましょう。リポジトリに関する詳細な情報は以下を参照してください。
http://maven.apache.org/guides/introduction/introduction-to-repositories.html

ローカルリポジトリへのインストールは以下のコマンドを実行します。

mvn install

これにより以下の出力が得られます。

[INFO] ----------------------------------------------------------------------------
[INFO] Building Maven Quick Start Archetype
[INFO]    task-segment: [install]
[INFO] ----------------------------------------------------------------------------
[INFO] [resources:resources]
[INFO] [compiler:compile]
Compiling 1 source file to <dir>/my-app/target/classes
[INFO] [resources:testResources]
[INFO] [compiler:testCompile]
Compiling 1 source file to <dir>/my-app/target/test-classes
[INFO] [surefire:test]
[INFO] Setting reports dir: <dir>/my-app/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
[surefire] Running com.mycompany.app.AppTest
[surefire] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.001 sec

Results :
[surefire] Tests run: 1, Failures: 0, Errors: 0

[INFO] [jar:jar]
[INFO] Building jar: <dir>/my-app/target/my-app-1.0-SNAPSHOT.jar
[INFO] [install:install]
[INFO] Installing <dir>/my-app/target/my-app-1.0-SNAPSHOT.jar to \
   <local-repository>/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar
[INFO] ----------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ----------------------------------------------------------------------------
[INFO] Total time: 5 seconds
[INFO] Finished at: Tue Oct 04 13:20:32 GMT-05:00 2005
[INFO] Final Memory: 3M/8M
[INFO] ----------------------------------------------------------------------------

テストの実行によりsurefire プラグインにて以下のネーミング規約のテストが実行されています。

  • **/*Test.java
  • **/Test*.java
  • **/*TestCase.java

デフォルトでは以下の名前のテストは除外されます。

  • **/Abstract*Test.java
  • **/Abstract*TestCase.java


ここまでで、Mavenのセットアップ、ビルド、テスト、パッケージングのプロセスを見てきました。この処理が、たった18行の POM により行われたことに注目してください。Antで同様の処理を行おうとすると2倍以上の設定が必要で、そして何より我々はまだMavenを使い始めたばかりなのです。


ここまで見てきたことの他に、Mavenは簡単なPOMへの設定で、様々なプラグインを使うことができます。これはMavenの重要な特徴の一つであるため、ここでその一例を見ていきます。

ここまで使用してきたPOMファイルには、プロジェクトのWebサイトを作成するだけの十分な情報が含まれています。おそらくはWebサイトをカスタマイズしたくなると思いますが、時間を掛けたくない場合は以下のコマンドを実行するだけです。

mvn site

また、以下のコマンドに見られるような多くのゴールがあります。

mvn clean

この処理はビルドデータと共にターゲットディレクトリを削除し、始める前のクリーンな状態にすることができます。


IntelliJ の IDEA 定義ファイルを作成するには以下のようにします。

mvn idea:idea


もし IDE として Eclipse を使用している場合は以下のコマンドを実行するだけです。これにより、Eclipseから作成したプロジェクトをインポートして使用することができます。

mvn eclipse:eclipse