NetBeansによるMaven2チュートリアル
ソフトウェア開発ではビルド、テスト、アーカイブの作成、ドキュメントの生成、デプロイなど様々な繰り返して行う作業が存在します。それらの作業の1つ1つは単純かも知れません。ですが、作業の順番を間違えたり、一部の作業をミスしたりすると大きな損失になります。また、一連の作業を実行する為に1つ1つの作業を終わるまで待機していると非常に大きな時間損失になります。
Maven2はそのような作業を自動化するためのプロジェクト管理ツールです。ビルドやテストなどを自動化することで作業時間は短縮できますし、手順を間違えることもありません。1度定義すれば繰り返して実行する事も容易です。
このようにMaven2を導入することで各作業が自動化され大きなメリットとなります。ですが、設定や導入に癖もあるので敷居が高いように思われているようです。そこでNetBeansを使ってMaven2を試してみるとします。
Maven2のインストール
Maven2は本来はコマンドラインから実行するツールです。NetBeansのMaven2プラグインを使えばIDEと統合されて便利に使う事ができますが、Maven2本体は別途インストールしておきます。
プロジェクト
プロジェクトとはアプリケーションの単位の事でファイル構造としてはあるディレクトリ全体を指します。通常はプロジェクト名とディレクトリ名は一致しており、プロジェクトディレクトの中にソースコードやドキュメントなどが含まれます。尚、ある程度のプロジェクトになると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」のままで良いでしょう。
プロジェクトファイル 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が設定されます。業務アプリケーション等では無視(削除)しても構いません。
ビルドする
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 secResults :
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のタスクを自動化することはソフトウェア開発で重要な意味があるわけです。NetBeansのMaven2サポートの良いところは、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で実行した場合と同じ結果となります。