プロジェクト管理ツールMaven2が便利な件

今更なんですが、ちょっと巨大なツールだし勉強するのがめんどくさいなと思って後回しにしていたのだけど、Javaで開発するなら使わない手はないってくらい便利なツールですね。特に大学でJavaを習うとpackageとCLASSPATHなどの項目に関してはほとんど触れられないのでそこら辺に苦手意識を持っている人は多いと思うのだけどMaven2を使うとあまり意識しなくても自動でやってくれるので凄く良いです。

以下、自分のためのメモ。

プロジェクトの作成

$mvn archetype:create -DgroupId=org.walf443.project_name -DartifactId=project_name

-Dオプションはpom.xmlに書くような設定を付け加えるオプション。新規プロジェクトを作成する際はgroupIdとartifactIdは必須。groupIdはimportの際につける名前空間に使われる。つまりこのプロジェクトのファイルを他のプロジェクトで使う際は、

import org.walf443.project_name.*;

とすれば良い。

artifactIdはプロジェクト名のこと。グループ名の最後の区切りとプロジェクト名は同じにするのが慣習っぽい。

このコマンドを実行すると、デフォルトでは以下のような構造が作成される

- project_name/
-- poe.xml : このプロジェクトに関する説明
-- src/    : ソースコードを置く場所
--- main/java/org/walf443/project_name/ : ソースコードはこのディレクトリに置く
--- test/java/org/walf443/project_name/ : JUnitによるテストコードをこのディレクトリに置く 
-- target/ : 生成されたclassファイルが置かれる場所

基本的に上記のtargetをのぞいた部分をVCSで管理しておくとよさそう。

他に

config/  : アプリの設定ファイル
bin/     :    実行ファイル。コマンドとして使うようなもの
javadoc/ : 生成されたJavaDocドキュメント
site/    : プロジェクトのホームページを管理しておくディレクトリ

などが一般的のようです。これらはコマンドを使うと自動生成されるようです。

よく使うコマンド

あまり良く調べてないですが本当に基本的なやつのみ。

mvn compile : プロジェクトのソースをすべてコンパイル。コンパイルエラーが起きないことを考えるに依存関係なども見てくれてるようだ。
mvn test    : テストをコンパイルして実行。
mvn package : jar、warなど適切な配布できる形式を作成する
mvn install : ローカルのリポジトリにパッケージをコピーする

長々とCLASSPATHを設定しなくてもmvn compileだけでコンパイルできちゃうのが素敵。

複数のモジュールのあるプロジェクト

アプリを書こうとするとたいてい複数のコンポーネントを書くことになるので大抵の場合はこれに当てはまると思う。

最初は単純でもクラスが増えていくごとに後で後悔することになるので最初からこちらのつもりで作っておいた方がよさそう。さくさくサブプロジェクトを追加できるのでわかりやすいディレクトリ構成にすることができる。

$mvn archetype:create -DgroupId=org.walf443.project_name -DartifactId=project_name
$cd project_name

でまずは全体のプロジェクトのディレクトリを作っておきプロジェクトホームへ移動、src、targetは不要なので削除。

pom.xmlの以下のところを書き換える。

  1. packagingをデフォルトのjarではなくpomにする。
  2. dependenciesタグを削除
  3. modulesタグを追加
project_name$ mvn archetype:create -DgroupId=org.walf443.project_name.sub -DartifactId=sub

を実行。

すると、project_name/pom.xmlのmodulesタグにsubプロジェクトが追加され、project_name/sub/pom.xmlのパレントタグにproject_nameが指定される。

以下同様にコンポーネントごとにサブプロジェクトを分ける。

ちょっと気になったのがorg.walf443.project_nameのレベルにもモジュールを作ってorg.walf443.project_name.subにもモジュールを作りたい場合

サブプロジェクトを作るにはpackagingのタイプをpomにする必要があるのでjarが作れない。どうやるもんなんだろう。

まとめ

Maven2を使うとディレクトリ構成やクラスパスさらには依存ライブラリなどをそれほど意識せず開発できるためよく使ってる人はもちろんのことたまにしか使わない人にもオススメです。

個人的にMaven2を使って嫌だった点はやたらとディレクトリの階層が深くなることと設定ファイルがXMLで閉じ忘れなどをしそうになることです。

後者はRavenを使うと解消されるのかなぁと思いました。

追記

Maven2のチュートリアルは
Maven - TECHSCORE -
http://www.techscore.com/tech/ApacheJakarta/Maven/index.html
がいろいろ見て回った中では一番わかりやすかったです。

このエントリの内容はこのページの要点をメモったものなので興味のある方はリンク先の参照をお奨めします。