Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Mavenを利用してオールインワンのプロジェクト環境を構築する

Mavenのプロジェクト管理機能の解説と実践例

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2005/10/07 12:00

本稿では、Mavenの導入と基本的な使用方法について解説します。mavenにはソフトウェア開発のプロジェクトをサポートするために、定義済みの典型的な開発ライフサイクル、各種レポートの自動生成、最新モジュールの自動ダウンロードといった機能があります。これらの機能を、具体的なプロジェクトのイメージを想定して順に紹介していきます。

目次

はじめに

 今日、ソフトウェアの開発手法にはさまざまな工夫が持ち寄られ、開発を支援する有用なツールやサービスがたくさん開発されています。XPやアジャイルといった概念的な手法から、ビルドツールやCVSなどの開発支援ツール、さらには便利な機能をまとめた小さいモジュールに至るまで、さまざまなものがあります。

 一方で、こういった知識、ツールの多さから、それら全てを上手に活用することは非常に難しいです。もしソフトウェア開発プロジェクトをはじめて実施するとすれば、さまざまな技術のリサーチや入念なプロジェクトの設計が必要になるでしょう。

 Mavenは、このような複雑なソフトウェア開発のフィールドにおいて、プロジェクト単位での開発フレームワークを提供しています。Mavenは典型的な開発プロジェクトの設計手順と、コンパイル、テスト、配備(デプロイ)といった典型的な開発のライフサイクルを自動化する機能を備えています。Mavenを活用することで、典型的で洗練された開発プロジェクトを簡単に実施することができます。

 今回はどのような開発プロジェクトにするか想定した上で、簡単なサンプルとともにMavenを使ったプロジェクト環境の構築例を解説します。

対象読者

 Javaプログラミングを行ったことがあり、プロジェクトでのソフトウェア開発に興味のある方を対象としています。

必要な環境

 このサンプルはJ2SE Development Kit 1.4.2Maven-1.0.2にて動作を確認しています。

プロジェクトの設計

 プロジェクトを管理することは非常に難しいですが、以下のようなことが必要になってきます。

  1. 「開発環境の整備」
  2. 「情報共有」
  3. 「品質管理」
  4. 「成果物の管理」

 そこで、今回は以下のようなプロジェクトを設計します。

  • 全メンバーが常に最新で同じモジュールに依存し、開発できる環境づくり
  • プロジェクト用のWEBサイトとメーリングリストを作成し、各種コミュニケーションを支援
  • 単体テストを用いた開発で品質を確保
  • CVSを用いた成果物のバージョン管理
開発プロジェクトと周辺環境
開発プロジェクトと周辺環境

 プロジェクトの設計では、このような概観の他にも、さらに詳細な設計が必要になってきます。例えば、「1.」についていえば、開発環境のディレクトリ構造について決定し、全体で共有しなければなりません。「2.」についていえば、プロジェクト用のWEBサイトの設計が必要です。設計段階で決めなければならないことが多く、プロジェクト環境構築も大変です。

 しかし、Mavenの提供する標準的開発手順と機能を再利用、カスタマイズすることで、こういった詳細な設計を含め、プロジェクト環境の構築を簡単に、洗練された形で進めていくことができます。

Mavenのインストール方法と基本操作

 MavenはApache Jakarta Projectから、「Apache License Version 2.0」に基づいて提供されるオープンソースのビルドツールです。同様のビルドツールとしてはAntが有名ですが、Mavenにはソフトウェア開発における標準的なライフサイクルが定義されており、より簡単に導入できるようになっています。

 Mavenは現在大きく分けてバージョン1とバージョン2の2つのバージョンが提供されており、バージョン2は現在Alpha版となっています。それぞれのホームページ、ダウンロードページは以下の表のとおりです。

Mavenのホームページとダウンロードページ
バージョンホームページダウンロードページ
1.xhttp://maven.apache.org/http://maven.apache.org/start/download.html
2.0http://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%\binpathの最後に追加。
JAVA_HOMEC:\Program Files\Java\jdk1.4.2JDKのインストールディレクトリ。
MAVEN_HOMEC:\Program Files\Apache Software Foundation\Maven 1.0.2Mavenのインストールディレクトリ。インストール時に自動で設定される。

 コマンドプロンプトで以下のように入力すると、Mavenの動作確認と、バージョンを確認することができます。

Maven動作確認
> maven -v
 __  __
|  \/  |__ _Apache__ ___
| |\/| / _` \ V / -_) ' \  ~ intelligent projects ~
|_|  |_\__,_|\_/\___|_||_|  v. 1.0.2

 Mavenの操作はプロジェクトの作業ディレクトリで「ゴール」を引数にしてmavenコマンドを打つことで実現されます。「ゴール」とは開発中のアプリケーションの構築をどこまで進めるか、ということを表します。例えば、ソースコードをコンパイルするには、次のように「java:compile」という名前のゴールを引数に与えます。

Maven動作確認
> maven java:compile

 Mavenのゴールは、そのゴールが他のゴールに依存する場合、依存するゴールについても自動で実行してくれるように設計されています。例えば、テストを実行するゴールを指定すれば、ソースコードのコンパイルも自動で実行してくれます。

 以下にMavenが標準で備える主なゴールを表にします。

Mavenのゴール
ゴール名説明
genapp新規にプロジェクト環境を作成
java:compileソースコードのコンパイル
testソースコードのコンパイルとテストの実行
jarテスト実行後に成果物をまとめたJARファイルを生成
siteテスト実行後に成果物を元にサイトを構築
test:compileテストコードのコンパイル
clean成果物の消去
dist成果物を元に配布用のJARファイルなどを生成

 以下では、サンプルをもとにプロジェクト環境を作り上げていきます。プロジェクト環境が簡単に、一歩一歩着実にできていくので楽しいですよ。

Mavenを使った開発環境づくり

 ここでは次のことを行います。

  1. 開発環境のディレクトリ構造構築
  2. 開発に依存するモジュールの自動ダウンロード

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:
...
補足説明
 もしProxyサーバを経由してネットワークにつないでいる場合、上の操作でエラーが起こります。その場合は以下のような「build.properties」ファイルを作成し、${user.home}(以下、「ユーザホーム」)ディレクトリ直下に置いてください。Windows XPの標準的な「ユーザホーム」ディレクトリは「C:\Documents and Settings\ユーザ名」となります。
「build.properties」
## ----------------------------------------------------------
## ${user.home}/build.properties
## ----------------------------------------------------------


maven.proxy.host=''プロキシサーバのホスト名''
maven.proxy.port=''ポート番号''
maven.proxy.username=''ユーザネーム(必要であれば記述)''
maven.proxy.password=''パスワード(必要であれば記述)''
 なお、Mavenでのプロパティ値は次のプロパティで設定された順に上書きされます(つまり、より下のプロパティファイルに設定された値が反映されます)。
  1. 「Mavenをインストールしたディレクトリ/bin/driver.properties」
  2. 「プロジェクトルート/project.properties」
  3. 「プロジェクトルート/build.properties」
  4. 「ユーザホーム/build.properties」
 プロキシの設定は、プロジェクトよりも個々のユーザに依存するので、「d.」に設定しておくのが無難でしょう。

 以上の操作で、以下のようなディレクトリ構造と、サンプルファイルが出来上がったと思います。また、依存するモジュールについては、「ユーザホーム/.maven」以下に配置されます。

デフォルトのディレクトリ構造
デフォルトのディレクトリ構造

 この環境を利用し、「src」ディレクトリ以下にはjavaソースを、「test」ディレクトリ以下にはjunit用のテストソースを加えていく、といった具合に開発を進めていきます。

 また、この中で、「project.xml」というファイルが開発プロジェクトを定義する中心的なファイルとなります。このファイルにはいくつかの情報、先に入力したプロジェクトの名前などが既に記載されています。このファイルを加工することで、プロジェクト環境の構築をさらに進めていくことができます。

 以降の話を進めるにあたって、本記事のサンプルファイルをダウンロードし、javaソースファイルを以下のように配置してください。また、「project.xml」については適宜記述方法を提示していきますが、ここでダウンロードしたものを確認しながら読み進めるのもよいでしょう(サンプルの中には、「sample」ディレクトリの他に、以下で出てくるロゴのサンプル、「build.properties」ファイル、「.cvspass」ファイルの例が含まれています)。

サンプルの配置
サンプルの配置

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が用意したリモートのリポジトリ(http://www.ibiblio.org/maven/)も強力ですが、プロジェクトによっては独自のリポジトリからモジュールを自動で取得できるようにしたいケースもあるでしょう。その場合は以下のようにプロジェクトルート直下にある「project.properties」を追加・編集します。
「project.properties」
maven.repo.remote=http://wings.project.to/repo/,
http://www.ibiblio.org/maven/
 また、プロジェクトが独自に依存するモジュールについては、「project.xml」に対して以下のように編集します。例では、プロジェクトが上で加えた「http://wings.project.to/repo/」リポジトリ以下の「wings/jars/myjar-1.0.jar」というモジュールに依存することを表しています。
「project.xml」
...
  <dependencies>
  ...
    <dependency>
      <groupId>wings</groupId>
      <artifactId>myjar</artifactId>
      <version>1.0</version>
      <type>jar</type>
      <properties/>
    </dependency>
  ...
  </dependencies>
...
 モジュールを取得するURLは、プロパティファイルの要素名とXMLの要素名を使って表した場合、次のようになります。
モジュールのURL
[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」上では以下の箇所でプロジェクト独自の単体テストの設定が可能です。主な設定要素を表にしました。

デフォルトの「project.xml」単体テスト設定
<unitTestSourceDirectory>src/test</unitTestSourceDirectory>
<unitTest>
  <includes>
    <include>**/*Test.java</include>
  </includes>
</unitTest>
「project.xml」の単体テストにかかわる要素
要素名親要素説明
<unitTestSourceDirectory><build>単体テストのソースコードの場所。「project.xml」がおいてあるディレクトリからの相対パス。
<unitTest><build>「project.xml」で単体テストを設定する箇所のルート要素。
<includes><unitTest>単体テストに含めるソースコードを記述する箇所のルート要素。任意の数の<include>要素を含めることができる。
<include><includes>単体テストに含めるソースコードの名前。「*」ワイルドカードを含めて表現することができる。
<excludes><unitTest>単体テストに含めたくないソースコードを記述する箇所のルート要素。任意の数の<exclude>要素を含めることができる。
<exclude><excludes>単体テストに含めたくないソースコードの名前。「*」ワイルドカードを含めて表現することができる。

 以上、Mavenを活用し、単体テストによる開発品質の向上を図れることを示しました。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2005/09/30 18:42 2005/9/30 著者最終校正

著者プロフィール

  • WINGSプロジェクト 渕 幸雄(フチ ユキオ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5