Murayama blog.

プログラミングと、その次の話

5分で学ぶMaven

これは何か

Maven – Maven in 5 Minutesを参考にまとめたものです。

MavenMaven in 5 Minutes

Installation

MavenJavaツールです。そのため以降の作業を続けるにはJavaのインストールは事前に済ませておいてください。Mavenダウンロードはこちらから、インストールについてはこちらを参考してください。

Mavenのインストールが完了したら、ターミナルやコマンドプロンプトから次のように入力します。

% mvn --version

そうするとインストールされたMavenのバージョンが表示されるでしょう。たとえばこんな具合に。

Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-12T05:58:10+09:00)
Maven home: /usr/local/Cellar/maven/3.2.3/libexec
Java version: 1.7.0_04-ea, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.9.4", arch: "amd64", family: "mac"

ネットワークの状態によっては追加の設定が必要な場合もあります。その場合はGuide to Configuring Mavenを参考にしてください。Windowsの場合はWindows Prerequisitesを確認しておくと良いでしょう。

Creating a Project

Mavenでプロジェクトを開始するためにディレクトリを作成する必要があります。コマンドラインで次のMavenゴールを実行します。

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Mavenをインストールしてすぐに上記のコマンドを実行すると時間がかかる場合があります。これは最新のアーティファクトプラグイン、jar、その他のファイルなどの総称)をローカルリポジトリにダウンロードする必要があるためです。場合によっては、タイムアウトする可能性があるので、その場合は2、3回コマンドを実行する必要があるでしょう。

コマンドが終了するとarchetype:generateゴールによって、artifactIdに指定した値と同名のディレクトリが生成されます。続いて生成されたディレクトリに移動します。

% cd my-app

生成されたディレクトリはMavenの提唱するstandard project structureに従った構成になっています。

my-app% tree
.
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── mycompany
    │               └── app
    │                   └── App.java
    └── test
        └── java
            └── com
                └── mycompany
                    └── app
                        └── AppTest.java

src/main/javaディレクトリにはプロジェクトのソースコードを格納します。 src/test/javaディレクトリにはテストコードを格納します。pom.xmlには後述するプロジェクトのProject Object Modelを記述します。

The POM

pom.xmlファイルはMavenのプロジェクト管理の核となるファイルです。プロジェクトをビルドするための多くの重要事項を含む唯一のファイルです。POMは複雑でややこしいことを実現できますが、今はすべてを理解する必要はありません。このプロジェクトのPOMファイルは次のようになっているでしょう。

<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/maven-v4_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>my-app</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>

What did I just do?

Mavenのゴールであるarchetype:generateを実行しました。その際にいくつかのパラメータを渡しました。接頭辞のarchetypeプラグインであり、プラグインはゴールを含んでいます。もしAntを知っているなら、Antのタスクと似ていると感じたかもしれません。このゴール(archetype:generate)は指定したarchetypeに基づいてシンプルなプロジェクトを生成しました。今のところプラグインについては、一般的な目標を持ったゴールのコレクションであると考えておけば良いでしょう。たとえばjboss-maven-pluginの場合は、JBossの様々な処理を扱うためのプラグインです。

Build the Project

% mvn package

上記のコマンドを実行するといくつかのアクションが表示され、最終的には次のような表示になります。

 ...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Thu Jul 07 21:34:52 CEST 2011
[INFO] Final Memory: 3M/6M
[INFO] ------------------------------------------------------------------------

最初に実行したコマンド(archetype:generate)と違って、2つ目のコマンドはpackageという単語一つでシンプルになっています。これはゴールではなくフェーズと呼びます。フェーズは、ビルドライフサイクルにおける一つのステップを意味します。一連のフェーズは順序付けられています。Mavenはフェーズを受け取ると、指定されたフェーズまでの一連のフェーズをすべて実行します。たとえばcompileフェーズを指定した場合、実際に実行されるフェーズは次のようになります。

  1. validate
  2. generate-sources
  3. process-sources
  4. generate-resources
  5. process-resources
  6. compile

パッケージされた最新のJARファイルを使ってテストを行うには次のように実行します。

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

次のようなお約束の出力を確認できるでしょう。

Hello World!

Running Maven Tools

Maven Phases

デフォルトのライフサイクルで実行されるフェーズは以下のとおりです。

  • validate:プロジェクトを検証して必要な情報が利用可能か確認する。
  • compile:プロジェクトのソースコードコンパイルする。
  • test:ユニットテスティングフレームワークを使ってコンパイルされたソースコードをテストする。これらのテストはパッケージやデプロイに不要なものとすべきである。
  • package:コンパイル済みのコードをJARファイルのような配布フォーマットにパッケージする。
  • integration-test:インテグレーションテスト環境にパッケージをデプロイする。
  • verify:パッケージを検証し、品質判定基準を満たしているか確認する。
  • install:ローカルリポジトリにパッケージをインストールし、多のプロジェクトから依存関係を解決できるようにする。
  • deploy:最新のパッケージをリモートリポジトリにコピーする。これにより、他の開発者やプロジェクトでパッケージを共有できるようになる。

また、Mavenには上記のデフォルトのリストの他に2つのライフサイクルがあります。

  • clean:ビルドによって作成されたアーティファクトを削除する。
  • site: このプロジェクトのドキュメントサイトを生成する。

フェーズは実際にはゴールにマッピングされます。フェーズごとに実行される具体的なゴールは、プロジェクトのパッケージタイプに依存しています。たとえばプロジェクトのタイプがJARの場合、packageフェーズでjar:jarゴールを実行します。同様にプロジェクトタイプがWARの場合は、packageフェーズでwar:warゴールを実行します。

面白いことにフェーズとゴールは順序立てて実行できます。

mvn clean dependency:copy-dependencies package

このコマンドはプロジェクトをクリーンし、依存関係をコピーします。それからパッケージを作成します(もちろんパッケージまでの前フェーズはすべて実行されます)。

Generating the Site

mvn site

このフェーズはプロジェクトのpomの情報に基づいてサイトを生成します。生成されたドキュメントはtarget/siteで確認できます。

Conclusion

駆け足での紹介でしたが、このガイドを通じてMavenの多彩さに興味を持ってもらえると幸いです。これはあくまでクイックスタートガイドだという点だけは念を押しておきます。とはいえ、Mavenの詳細を学ぶ準備は整いました。Maven Getting Started Guideも参考にしてください。