はじめに
今日、ソフトウェアの開発手法にはさまざまな工夫が持ち寄られ、開発を支援する有用なツールやサービスがたくさん開発されています。XPやアジャイルといった概念的な手法から、ビルドツールやCVSなどの開発支援ツール、さらには便利な機能をまとめた小さいモジュールに至るまで、さまざまなものがあります。
一方で、こういった知識、ツールの多さから、それら全てを上手に活用することは非常に難しいです。もしソフトウェア開発プロジェクトをはじめて実施するとすれば、さまざまな技術のリサーチや入念なプロジェクトの設計が必要になるでしょう。
Mavenは、このような複雑なソフトウェア開発のフィールドにおいて、プロジェクト単位での開発フレームワークを提供しています。Mavenは典型的な開発プロジェクトの設計手順と、コンパイル、テスト、配備(デプロイ)といった典型的な開発のライフサイクルを自動化する機能を備えています。Mavenを活用することで、典型的で洗練された開発プロジェクトを簡単に実施することができます。
今回はどのような開発プロジェクトにするか想定した上で、簡単なサンプルとともにMavenを使ったプロジェクト環境の構築例を解説します。
対象読者
Javaプログラミングを行ったことがあり、プロジェクトでのソフトウェア開発に興味のある方を対象としています。
必要な環境
このサンプルはJ2SE Development Kit 1.4.2、Maven-1.0.2にて動作を確認しています。
プロジェクトの設計
プロジェクトを管理することは非常に難しいですが、以下のようなことが必要になってきます。
- 「開発環境の整備」
- 「情報共有」
- 「品質管理」
- 「成果物の管理」
そこで、今回は以下のようなプロジェクトを設計します。
- 全メンバーが常に最新で同じモジュールに依存し、開発できる環境づくり
- プロジェクト用のWEBサイトとメーリングリストを作成し、各種コミュニケーションを支援
- 単体テストを用いた開発で品質を確保
- CVSを用いた成果物のバージョン管理
![開発プロジェクトと周辺環境 開発プロジェクトと周辺環境](http://cz-cdn.shoeisha.jp/static/images/article/177/dev_project.gif)
プロジェクトの設計では、このような概観の他にも、さらに詳細な設計が必要になってきます。例えば、「1.」についていえば、開発環境のディレクトリ構造について決定し、全体で共有しなければなりません。「2.」についていえば、プロジェクト用のWEBサイトの設計が必要です。設計段階で決めなければならないことが多く、プロジェクト環境構築も大変です。
しかし、Mavenの提供する標準的開発手順と機能を再利用、カスタマイズすることで、こういった詳細な設計を含め、プロジェクト環境の構築を簡単に、洗練された形で進めていくことができます。
Mavenのインストール方法と基本操作
MavenはApache Jakarta Projectから、「Apache License Version 2.0」に基づいて提供されるオープンソースのビルドツールです。同様のビルドツールとしてはAntが有名ですが、Mavenにはソフトウェア開発における標準的なライフサイクルが定義されており、より簡単に導入できるようになっています。
Mavenは現在大きく分けてバージョン1とバージョン2の2つのバージョンが提供されており、バージョン2は現在Alpha版となっています。それぞれのホームページ、ダウンロードページは以下の表のとおりです。
バージョン | ホームページ | ダウンロードページ |
1.x | http://maven.apache.org/ | http://maven.apache.org/start/download.html |
2.0 | http://maven.apache.org/ maven2/index.html | http://maven.apache.org/maven2/download.html |
今回は安定版である「Maven 1.0.2」を使用します。
まずは、maven-1.0.2.exeをダウンロードページのリンク先から適当なディレクトリにダウンロードし、実行します。インストール時の設定はデフォルトのままでよいです。
インストールが終わったら、以下のように環境変数を追加、設定します。
変数名 | 値 | 説明 |
Path | …;%MAVEN_HOME%\bin | pathの最後に追加。 |
JAVA_HOME | C:\Program Files\Java\jdk1.4.2 | JDKのインストールディレクトリ。 |
MAVEN_HOME | C:\Program Files\Apache Software Foundation\Maven 1.0.2 | Mavenのインストールディレクトリ。インストール時に自動で設定される。 |
コマンドプロンプトで以下のように入力すると、Mavenの動作確認と、バージョンを確認することができます。
> maven -v __ __ | \/ |__ _Apache__ ___ | |\/| / _` \ V / -_) ' \ ~ intelligent projects ~ |_| |_\__,_|\_/\___|_||_| v. 1.0.2
Mavenの操作はプロジェクトの作業ディレクトリで「ゴール」を引数にしてmavenコマンドを打つことで実現されます。「ゴール」とは開発中のアプリケーションの構築をどこまで進めるか、ということを表します。例えば、ソースコードをコンパイルするには、次のように「java:compile」という名前のゴールを引数に与えます。
> maven java:compile
Mavenのゴールは、そのゴールが他のゴールに依存する場合、依存するゴールについても自動で実行してくれるように設計されています。例えば、テストを実行するゴールを指定すれば、ソースコードのコンパイルも自動で実行してくれます。
以下にMavenが標準で備える主なゴールを表にします。
ゴール名 | 説明 |
genapp | 新規にプロジェクト環境を作成 |
java:compile | ソースコードのコンパイル |
test | ソースコードのコンパイルとテストの実行 |
jar | テスト実行後に成果物をまとめたJARファイルを生成 |
site | テスト実行後に成果物を元にサイトを構築 |
test:compile | テストコードのコンパイル |
clean | 成果物の消去 |
dist | 成果物を元に配布用のJARファイルなどを生成 |
以下では、サンプルをもとにプロジェクト環境を作り上げていきます。プロジェクト環境が簡単に、一歩一歩着実にできていくので楽しいですよ。
Mavenを使った開発環境づくり
ここでは次のことを行います。
- 開発環境のディレクトリ構造構築
- 開発に依存するモジュールの自動ダウンロード
1.開発環境のディレクトリ構造構築
開発環境作りとして、まずは開発環境のディレクトリを整えます。といっても、多くのプロジェクトはMavenが自動生成するディレクトリ構造をそのまま流用できます。開発用に使うトップディレクトリ(以下「プロジェクトルート」。ここでは開発用に、「c:\dev\sample」というディレクトリを作ったと仮定)を作成した後は、以下のようにgenappゴールをmavenコマンドの引数に与えるだけです(genappの実行後、対話式にいくつかの問い合わせがあるので、今回は以下のように答えます)。
>cd c:\dev\sample > maven genapp ... Enter a project template to use: [default] ''[Enter]'''''(←環境構築にデフォルトのテンプレートをつかう)''' Please specify an id for your application: [app] ''sample[Enter]'''''(←プロジェクトのID。ここではsample)''' Please specify a name for your application: [Example Application] ''sample[Enter]'''''(←プロジェクトの名前。ここではsample)''' Please specify the package for your application: [example.app] ''project.wings[Enter]'' '''(↑プロジェクトで作るアプリケーションの基底となる''' '''パッケージ名。ここではproject.wings)''' build:start: ...
## ---------------------------------------------------------- ## ${user.home}/build.properties ## ---------------------------------------------------------- maven.proxy.host=''プロキシサーバのホスト名'' maven.proxy.port=''ポート番号'' maven.proxy.username=''ユーザネーム(必要であれば記述)'' maven.proxy.password=''パスワード(必要であれば記述)''
- 「Mavenをインストールしたディレクトリ/bin/driver.properties」
- 「プロジェクトルート/project.properties」
- 「プロジェクトルート/build.properties」
- 「ユーザホーム/build.properties」
以上の操作で、以下のようなディレクトリ構造と、サンプルファイルが出来上がったと思います。また、依存するモジュールについては、「ユーザホーム/.maven」以下に配置されます。
![デフォルトのディレクトリ構造 デフォルトのディレクトリ構造](http://cz-cdn.shoeisha.jp/static/images/article/177/default_directry.gif)
この環境を利用し、「src」ディレクトリ以下にはjavaソースを、「test」ディレクトリ以下にはjunit用のテストソースを加えていく、といった具合に開発を進めていきます。
また、この中で、「project.xml」というファイルが開発プロジェクトを定義する中心的なファイルとなります。このファイルにはいくつかの情報、先に入力したプロジェクトの名前などが既に記載されています。このファイルを加工することで、プロジェクト環境の構築をさらに進めていくことができます。
以降の話を進めるにあたって、本記事のサンプルファイルをダウンロードし、javaソースファイルを以下のように配置してください。また、「project.xml」については適宜記述方法を提示していきますが、ここでダウンロードしたものを確認しながら読み進めるのもよいでしょう(サンプルの中には、「sample」ディレクトリの他に、以下で出てくるロゴのサンプル、「build.properties」ファイル、「.cvspass」ファイルの例が含まれています)。
![サンプルの配置 サンプルの配置](http://cz-cdn.shoeisha.jp/static/images/article/177/sample_haiti.gif)
2.開発に依存するモジュールの自動ダウンロード
作業ディレクトリの構築はたった1コマンドで済んでしまいました。次に、開発者が必要なモジュールを自動的にダウンロードできるようにします。といっても、この機能はMavenがデフォルトで備えている機能なので、特に設定の必要がありません。
Mavenは主要なモジュールをMavenの用意するリポジトリに蓄積しています。Mavenは外部モジュールが必要になった際に、デフォルトでここにおいてあるモジュールから必要なものを探し、自動でローカルのリポジトリ(デフォルトでは「ユーザホーム/.maven/」以下)にダウンロードします。
ためしに、コンパイル作業を通して必要なファイルがダウンロードされる様子を見ましょう。以下のようにjava:compileゴールを指定してください。
>cd c:\dev\sample >maven java:compile ... 「commons-jelly-tags-antlr-20030211.143720.jar」のダウンロードを試みています。 7K downloaded 「commons-lang-2.0.jar」のダウンロードを試みています。 165K downloaded 「antlr-2.7.2.jar」のダウンロードを試みています。 349K downloaded build:start: ... [javac] Compiling 2 source files to C:\dev\sample\target\classes BUILD SUCCESSFUL Total time: 6 seconds Finished at: Fri Sep 16 20:42:04 JST 2005
Mavenが自動で必要なモジュールを取得してくれることがお分かりいただけたでしょう。このため、プロジェクト全体を通して、プロジェクトメンバが共通して同じモジュールを取得し利用する環境が既に構築されていることも確認いただけたと思います。
maven.repo.remote=http://wings.project.to/repo/,http://www.ibiblio.org/maven/
... <dependencies> ... <dependency> <groupId>wings</groupId> <artifactId>myjar</artifactId> <version>1.0</version> <type>jar</type> <properties/> </dependency> ... </dependencies> ...
[maven.repo.remote][groupId]/[type]s/[artifactId]-[version].[type]
Mavenを用いた開発スタイル構築
プロジェクトを進める上で、開発スタイルを整備することは非常に重要です。プロジェクトメンバがそれぞれ好き勝手に開発した場合、成果物の品質は低く、バラバラになってしまします。
Mavenではデフォルトで標準的なビルド方法を備えているため、簡単にスタイル構築を決定することができます。
今回は、junitテスティングフレームワークを用いて、単体テストを用いた開発方法を紹介します。単体テストは、機能(例えば、1メソッド)ごとに満たすべきテストプログラムを作り、全てのテストプログラムをクリアさせることで品質を確保させます。このテスト工程を自動化し、繰り返し行えるようにするのがjunitテスティングフレームワークです。junitテスティングフレームワークについてはここでは詳しく扱いませんが、記事末に参考になる書籍を載せています。
既に前節でテストソースコードの取得、およびコンパイルがすんでいるため、以下ではテスト方法を見ていきます。
次のように操作してください。
>cd c:\dev\sample >maven test:test ... test:test: [junit] Running project.wings.MyMessageTest [junit] Tests run: 3, Failures: 0, Errors: 0,Time elapsed: 0.02 sec BUILD SUCCESSFUL Total time: 2 seconds Finished at: Fri Sep 16 21:31:24 JST 2005
無事テストに成功し、エラー・失敗なしという報告を得ました。
デフォルトの設定でも単体テストは十分に機能しますが、「project.xml」上では以下の箇所でプロジェクト独自の単体テストの設定が可能です。主な設定要素を表にしました。
<unitTestSourceDirectory>src/test</unitTestSourceDirectory> <unitTest> <includes> <include>**/*Test.java</include> </includes> </unitTest>
要素名 | 親要素 | 説明 |
<unitTestSourceDirectory> | <build> | 単体テストのソースコードの場所。「project.xml」がおいてあるディレクトリからの相対パス。 |
<unitTest> | <build> | 「project.xml」で単体テストを設定する箇所のルート要素。 |
<includes> | <unitTest> | 単体テストに含めるソースコードを記述する箇所のルート要素。任意の数の<include> 要素を含めることができる。 |
<include> | <includes> | 単体テストに含めるソースコードの名前。「*」ワイルドカードを含めて表現することができる。 |
<excludes> | <unitTest> | 単体テストに含めたくないソースコードを記述する箇所のルート要素。任意の数の<exclude> 要素を含めることができる。 |
<exclude> | <excludes> | 単体テストに含めたくないソースコードの名前。「*」ワイルドカードを含めて表現することができる。 |
以上、Mavenを活用し、単体テストによる開発品質の向上を図れることを示しました。