NetBeansによるMaven2チュートリアル

ソフトウェア開発ではビルド、テスト、アーカイブの作成、ドキュメントの生成、デプロイなど様々な繰り返して行う作業が存在します。それらの作業の1つ1つは単純かも知れません。ですが、作業の順番を間違えたり、一部の作業をミスしたりすると大きな損失になります。また、一連の作業を実行する為に1つ1つの作業を終わるまで待機していると非常に大きな時間損失になります。
Maven2はそのような作業を自動化するためのプロジェクト管理ツールです。ビルドやテストなどを自動化することで作業時間は短縮できますし、手順を間違えることもありません。1度定義すれば繰り返して実行する事も容易です。
このようにMaven2を導入することで各作業が自動化され大きなメリットとなります。ですが、設定や導入に癖もあるので敷居が高いように思われているようです。そこでNetBeansを使ってMaven2を試してみるとします。

Maven2のインストール

Maven2は本来はコマンドラインから実行するツールです。NetBeansMaven2プラグインを使えばIDEと統合されて便利に使う事ができますが、Maven2本体は別途インストールしておきます。

Javaの設定など

Maven2Javaコンパイラ等を使用しますのでJDKがインストールされている必要があります。また、環境変数JAVA_HOMEにJDKのインストールディレクトリが設定されている必要があります。次のコマンドを実行して確認してください。

D:\>java -version
java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode, sharing)

D:\>echo %JAVA_HOME%
D:\lib\Java\jdk1.6.0_12

インストールと設定

http://maven.apache.org/
Maven2はこちらからダウンロードしてください。インストールは適当なディレクト*1に解凍し、Windowsであれば環境変数のpathにMaven2のbinディレクトリを通します*2。確認の為、コマンドプロンプトからバージョン情報を確認してみましょう。

D:\>mvn -v
Maven version: 2.0.10
Java version: 1.6.0_14
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"

プロジェクト

プロジェクトとはアプリケーションの単位の事でファイル構造としてはあるディレクトリ全体を指します。通常はプロジェクト名とディレクトリ名は一致しており、プロジェクトディレクトの中にソースコードやドキュメントなどが含まれます。尚、ある程度のプロジェクトになるとjat単位等でプロジェクトを分割して管理する事もあります。今回は1つのアプリケーションが1つのプロジェクトになるようなシンプルなケースのみを扱います。

Maven2プロジェクトの構成

一般的なプロジェクトではソースコード、リソースファイル、テスト用のソースコードなどを幾つかのディレクトリにわけて管理します。ですが、どんな構成にするかは特に決まっておらず各プロジェクトで違うことが多くありました。Maven2ではソースのディレクトリ構成などのデフォルト設定を提供しています。デフォルト設定がある為に、デフォルトのまま使いたければわざわざ設定を記述する必要がありません。また、はじめてみるプロジェクト*3でも構成を把握しやすいメリットもあります。これはいわゆる「設定より規約」の考え方です。このためにAntなどに比べて設定ファイルの記述量が少なくて済みます*4

尚、通常はディレクトリ構成を変える必要はありませんが、既存のプロジェクトを後からMaven2のプロジェクトに移行する場合などは設定に記述します。

NetBeansの設定

NetBeansでは6.7よりMaven2サポートはJavaSEの開発環境に含まれるようになりました。6.5までまたは別のパッケージからJava開発プラグインをインストールした場合はプラグインとしてインストールする必要があります。ですが、Eclipseに比べてNetBeansプラグインの管理が簡単です。NetBeansを起動したならばメニューのツールからプラグインを選択します。

次に「使用可能なプラグイン」のタブを選択し、Maven2プラグインを探します。検索ボックスに「mav」まで入力すればほぼ1つに絞り込まれれますので活用しましょう。
後はプラグインにチェックを入れて画面の指示に従っていけばインストール完了です。


Maven2プロジェクトの作成

NetBeansではMaven2で管理されることを前提としたMaven2プロジェクトを作成することができます。当然ながら、コマンドラインから作成する事もできますが、NetBeansの紹介も兼ねてIDEを使ってMaven2プロジェクトを作成してみます。新規プロジェクトから「Mavenプロジェクト」を選択してください。尚、「既存のPOMを使用したMavenプロジェクト」を選択すると、コマンドラインから作成したプロジェクトや既存のMaven2プロジェクトを取込むことができます。

続けてMaven原型を選択します。原型はいわゆるテンプレートで、代表的な構成のプロジェクト(例えばSpring + HibernateのWebアプリ)を作成する機能です。ここでは練習の為に最もシンプルな「Maven クイックスタート原型」を選択してください。


最後にプロジェクト名などの情報を入力します。次のように入力しました。

  • プロジェクト名「maven-tutorial」
  • グループID「jp.deathmarch」
  • バージョン「1.0-SNAPSHOT」(デフォルト)
  • パッケージ「jp.deathmarch.maventutorial」(デフォルト)
プロジェクト名(アーティファクトID)とグループID

後述のグループIDと合わせてプロジェクトのIDとなります。Javaのアプリケーションでは組織のドメイン名をパッケージ名の前半とし、アプリケーション名をパッケージの後半に続ける慣習になっています。この慣習に合わせ、グループIDがプロジェクト名の前、アーティファクトID(プロジェクト名)を設定します。尚、パッケージ名に大文字や記号は推奨されていないため、複数の単語はすべて小文字で連結します((プロジェクト名はハイフンでつなぐことが多い)。
例えば、「jp.deathmarch」というグループ名(ドメイン名)に対し、「maven2-tutorial」というプロジェクトを作成します。この時、パッケージ名はハイフンを削除するのでjp.deathmarch.maven2tutorialとなります。後は、必要に応じてサブパッケージを作成します。この辺は入力してみると勝手になるのでお任せしてしまいましょう。

バージョン

Maven2ではプロジェクトのリリース時のバージョンも管理する事が可能です。現時点では特に意識しませんので「1.0-SNAPSHOT」のままで良いでしょう。

パッケージ

パッケージはデフォルトでグループID+プロジェクト名になるはずです。通常はこのままで良いでしょう。

尚、最初のプロジェクト作成には時間がかかります。これは、Maven2プラグイン形式で構成されており、必要に応じてプラグインを自動的にダウンロードしてくる仕組みだからです*5。尚、2回目以降はローカルにダウンロードされているので時間はかかりません。

プロジェクトファイル pom.xml

Maven2プロジェクトの設定や構成はpom.xml(pom=project object model)というXMLファイルで記述されています。なんらかのオープンソースソースコードをダウンロードしたとき、POMファイルがあるならば、そのプロジェクトはMaven2プロジェクトとも言えます。最近のプロダクトであれば大抵はPOMファイルが含まれているはずです。
NetBeansではプロジェクトファイルの下に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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>jp.deathmarch</groupId>
  <artifactId>maven-tutorial</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>maven-tutorial</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>

XMLを眺めているとプロジェクトの作成時に設定したgroupId、artifactId、version等が含まれているのが解るでしょう。ナビゲータでも確認できます。

packaging

作成したプロジェクトはpackagingにjarが設定されています。packagingはプロジェクトがどんな種類のプロジェクトを表すかを示す重要な要素です。jarの場合、最終的にはjarファイルにアーカイブしてリリースされる通常のJavaアプリケーションとなります*6。例えば、なんらかのライブラリであったりスタンドアローンのSwingアプリケーションなどです。他にはpackagingにはwar(Webアプリケーション)などが設定できます。

url

URLはプロジェクトのURLです。オープンソースなどではプロジェクトサイトのURLが設定されます。業務アプリケーション等では無視(削除)しても構いません。

dependencies

dependenciesは依存ライブラリの定義です。Maven2の大きな特徴として、外部ライブラリをリポジトリに管理して置くことで個々にダウンロードして設定する手間がなくなる事があります*7。依存ライブラリの定義はPOMに記述され、最初のビルド時に必要なライブラリがダウンロードされる仕組みです(後述)。
デフォルトではテスト用のライブラリとしてJUnitが指定されています。

ビルドする

NetBeansを使ってプロジェクトを作成するとデフォルトでHelloWorldアプリケーションが作成されています。NetBeans上でコードを修正して保存すると、通常のプロジェクトと同じようにインクリメンタルビルドされます。違いを実感するために、「生成物を削除して構築」を行いましょう。日本語化されていると意味が解りませんが、要はクリーンビルドです*8
すると出力ウィンドウにビルドが行われている様子が流れるはずです。これも最初のビルド時にはプラグインや依存ファイルを取得するために時間がかかります。

NetBeans: Executing 'mvn.bat -Dnetbeans.execution=true clean install'
NetBeans: JAVA_HOME =D:\lib\Java\jdk1.6.0_13\jdk1.6.0_13
Scanning for projects...

                                                                                                                                              • -

Building maven-tutorial
task-segment: [clean, install]

                                                                                                                                              • -

[clean:clean]
[resources:resources]
[WARNING] Using platform encoding (MS932 actually) to copy filtered resources, i.e. build is platform dependent!
skip non existing resourceDirectory D:\projects\tutorial\maven-tutorial\src\main\resources
[compiler:compile]
Compiling 1 source file to D:\projects\tutorial\maven-tutorial\target\classes
[resources:testResources]
[WARNING] Using platform encoding (MS932 actually) to copy filtered resources, i.e. build is platform dependent!
skip non existing resourceDirectory D:\projects\tutorial\maven-tutorial\src\test\resources
[compiler:testCompile]
Compiling 1 source file to D:\projects\tutorial\maven-tutorial\target\test-classes
[surefire:test]
Surefire report directory: D:\projects\tutorial\maven-tutorial\target\surefire-reports

                                                                                                            • -

T E S T S

                                                                                                            • -

Running jp.deathmarch.maventutorial.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[jar:jar]
Building jar: D:\projects\tutorial\maven-tutorial\target\maven-tutorial-1.0-SNAPSHOT.jar
[install:install]
Installing D:\projects\tutorial\maven-tutorial\target\maven-tutorial-1.0-SNAPSHOT.jar to C:\Documents and Settings\shuji\.m2\repository\jp\deathmarch\maven-tutorial\1.0-SNAPSHOT\maven-tutorial-1.0-SNAPSHOT.jar

                                                                                                                                              • -

BUILD SUCCESSFUL

                                                                                                                                              • -

Total time: 4 seconds
Finished at: Tue Jun 09 13:26:11 JST 2009
Final Memory: 15M/28M

                                                                                                                                              • -

文字コードの警告がでていますが、概要としてはclean(生成物の削除)、compile、test、jarへのアーカイブ、installという一連の処理が実行されています。installはローカルリポジトリというローカル環境にjarファイルを保存する手順で、別のプロジェクトからこのプロジェクトを使う場合に必要な処理です。特に設定していないのにも関わらず実行できている事がポイントです。尚、デフォルトでどこまで実行するかなどは細かくカスタマイズできますが、それは次回以降に解説したいかと思います。

コマンドラインからの実行

Maven2は本来コマンドラインから使ったり、cronなどで処理を自動化するためのツールです。例えばテストケースが非常に多くなってくればテストだけで数時間かかることもあります。よってMaven2のタスクを自動化することはソフトウェア開発で重要な意味があるわけです。NetBeansMaven2サポートの良いところは、IDE上で設定したままの状態でコマンドラインからもそのまま実行できることです。EclipseにもMaven2をサポートするプラグインはありますが、使い勝手はイマイチです。
それではコマンドラインから実行してみます。コマンドプロンプトを開き、プロジェクトのあるディレクトリまで移動し、mvnコマンドを実行します。

D:\projects\tutorial\maven-tutorial>mvn
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO]

You must specify at least one goal. Try 'mvn install' to build or 'mvn --help' f
or options
See http://maven.apache.org for more information.

少なくとも1つの「goal」を指定しなさい、とエラーが発生しています。maven2での「goal」とはコンパイルやテストと言った処理を表します。また、それぞれの「goal」には依存する「goal」があります。例えば、「test」は「compile」が前提になっているため、「test」を指定するとcompileとtestが実行されます。

D:\projects\tutorial\maven-tutorial>mvn test
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building maven-tutorial
[INFO] task-segment: [test]
[INFO] ------------------------------------------------------------------------
(中略)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Tue Jun 09 14:01:51 JST 2009
[INFO] Final Memory: 6M/12M
[INFO] ------------------------------------------------------------------------

尚、clean(生成物の削除)は依存関係にないため、削除してからコンパイルをしたい場合などはcleanを実行します。また、goalは複数指定することもできるので次のようにして実行します。

mvn clean test

NetBeansの設定ではデフォルトのGoalはinstallです。したがって「mvn clean install」を実行するとNetBeansで実行した場合と同じ結果となります。

生成物

Maven2でビルドしたクラスやアーカイブしたjarファイルはtargetディレクトリに保存されます。

まとめ

とりあえずはNetBeansを使ってMaven2プロジェクトを作成し、簡単な操作を行ってみました。次回は依存ライブラリの追加や基本的な設定を紹介したいと思います。

*1:例: C:\lib\maven2

*2:例:path=...;C:\lib\maven2\bin;

*3:特にオープンソースなど

*4:ただし、慣れるまでは難しく感じます

*5:オフライン環境では試すことができません

*6:メインクラスがある場合もない場合もある

*7:ただし、依存関係など問題もありますが、今回は割愛します

*8:無理に日本語化しなくてもカタカナでいいと思うんですが・・・