はじめの第一歩
なにはともあれMavenでプロジェクトビルドを体験してみましょう。
適当なディレクトリを作ってください。
F:\gaoqiao1>mkdir my-app
F:\gaoqiao1>cd my-app
はじめてのプロジェクト作成
以下のコマンドを実行します。F:\gaoqiao1\my-app>mvn archetype:create \
-DgroupId=com.mycompany.app -DartifactId=my-jar
このコマンドは、archetypeプラグインのcreateゴールを使ってプロジェクトの雛型を作ります。
archetype(アーキタイプ)とは「原型」という意味で、プロジェクトテンプレートのことを言います。アーティファクト(Artifact:ビルド成果物)の種類(JAR、WAR、EAR、Mavenプラグイン等)に対応したアーキタイプが各種用意されています。archetypeプラグインのcreateゴールはデフォルトでJARアーティファクト用のプロジェクトを出力します。
Mavenのプロジェクトは必ず一意のグループIDとアーティファクトIDを持ちます。ここではグループIDにcom.mycompany.app、アーティファクトIDにmy-jarを指定しています。
このコマンドの最初の実行には結構時間がかかります。というのも、このプラグイン・ゴールを実行するのに必要なライブラリがリモートリポジトリからローカルリポジトリにダウンロードされるためです。
ローカルリポジトリは%HOMEPATH%\.m2\repositoryに作られます。
プロジェクトのディレクトリ構成
コマンドの実行が終了すると、アーティファクトIDと同じmy-jarというディレクトリが作成されます。その下は以下の構成になっています。└─my-jar
│ pom.xml
│
└─src
├─main
│ └─java
│ └─com
│ └─mycompany
│ └─app
│ App.java
│
└─test
└─java
└─com
└─mycompany
└─app
AppTest.java
- pom.xml
Mavenのビルドファイルで、Antのbuild.xmlに相当します。
pom.xmlのpomとはProject Object Modelの略で、まさにMavenプロジェクトをモデル化したものになります。
最 初に出力された段階では、グループID、アーティファクトID、バージョン番号、プロジェクト名といったプロジェクトの素性を表す情報、そしてこのプロ ジェクトが依存するライブラリ情報(dependenciesタグで指定。依存先ライブラリもグループID、アーティファクトIDを持ち、Mavenアー ティファクトとして管理されていることに注意)などが記述されているだけです。
一方、ビルド方法については一切記述されていません。
たったこれだけのビルドファイルでビルドできてしまうのが、Mavenの大きな特徴の一つです。
(※逆にこのシンプルさが、Mavenは何をしてくれるのかわからない・・・というとっつきにくさにもつながっているのかもしれません)
- src
アーティファクト出力の根源(ソース)、すなわちアーティファクトを出力するのに必要なものは全てsrcディレクトリ配下に置かれます。
- src\main、src\test
src直下のディレクトリは大きく2つに分かれます。アーティファクト出力に直接関係のあるものはmainディレクトリに、アーティファクト出力に直接関係しないもの(テスト用コード、プロジェクトサイト用コードなど)はその他のディレクトリに置かれます。
このサンプルではmain以下にJavaソースコード、テスト用コードがtestディレクトリに置かれます。
Mavenではプロジェクトの標準ディレクトリ構成が決められています。
この標準は先人の経験から出されたベストプラクティスであり、このおかげでプロジェクトの可搬性が上がり、プラグインもデフォルト設定のまま簡単に再利用できます。
標準以外の構成をカスタマイズすることも可能ですが、よっぽどの理由がない限りあまりメリットはないでしょう。
プロジェクトのビルド
Mavenでビルドをするにはpackageゴールを使います。F:\gaoqiao1\my-app\my-jar>mvn package
コンソールに出力されるメッセージを観察していると、コンパイルが行われてからテストが実行されて、最後にJARパッケージが作成されるのがわかります。このようにpackageゴールは複数のビルドフェーズをまとめて実行します。このビルドフェーズのまとまりのことをビルド・ライフサイクル(Build Lifecycle)といいます。ビルド・ライフサイクルについては別の機会(未完)に紹介します。
packageゴールが終了すると、以下のようなディレクトリ構成になります。
└─my-jar
│ pom.xml
│
├─src
│ ├─main
│ │ └─java
│ │ └─com
│ │ └─mycompany
│ │ └─app
│ │ App.java
│ │
│ └─test
│ └─java
│ └─com
│ └─mycompany
│ └─app
│ AppTest.java
│
└─target
│ exported-pom.xml
│ my-jar-1.0-SNAPSHOT.jar
│
├─classes
│ └─com
│ └─mycompany
│ └─app
│ App.class
│
├─surefire-reports
│ com.mycompany.app.AppTest.txt
│ TEST-com.mycompany.app.AppTest.xml
│
└─test-classes
└─com
└─mycompany
└─app
AppTest.class
アーティファクト(ここではmy-jar-1.0-SNAPSHOT.jar)はtargetディレクトリに出力されます。これも標準ディレクトリ構成として決められています。
MavenでWEBアプリケーションを開発する
WEBアプリケーション用のアーキタイプを使って、WEBアプリケーションのプロジェクトの雛型を作ります。F:\gaoqiao1\my-app>mvn archetype:create \
-DgroupId=com.mycompany.app \
-DartifactId=my-webapp \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp
最後の2つの引数でWEBアプリケーション用アーキタイプを指定しています。
プロジェクトのディレクトリ構成は以下のようになっています。
└─my-webapp
│ pom.xml
│
└─src
└─main
├─resources
└─webapp
│ index.jsp
│
└─WEB-INF
web.xml
src\main直下にwebappというディレクトリが置かれています。
また、雛型ですのでサーブレットなどのJavaコードは含まれていません。標準ディレクトリ構成にしたがって、src\main\javaの下にJavaコードを置いてください。
さきほどと同様にpackageゴールでビルドすると、targetディレクトリにmy-webapp.warという名前でWEBアプリケーションが出力されます。
F:\gaoqiao1\my-app\my-webapp>mvn package
複数のサブプロジェクトで構成されるプロジェクト
my-webappプロジェクトとmy-jarプロジェクトから構成されるmy-appプロジェクトを考えてみましょう。それぞれのプロジェクトの依存関係は以下の通りです。1.my-jarディレクトリのpom.xmlをmy-app直下にコピーしてください。
2.コピーした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>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</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>
<modules>
<module>my-jar</module>
<module>my-webapp</module>
</modules>
</project>
- artifactidをmy-jarからmy-appに変更
- packagingをjarからpomに変更
- modulesセクションを上記サンプルのように追加
3.my-jarプロジェクトの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">
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-jar</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</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>
- parentセクションを上記サンプルのように追加
POMは親POMで定義された設定を継承することができます。この機能はとても強力なもので、プロジェクトの共通設定を親POMに記述しておくことによって、プロジェクト全体をコントロールすることができます。(親POMの応用例は、都度紹介していきます。)
4.my-webappプロジェクトの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">
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Webapp Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-jar</artifactId>
<version>1.0-SNAPSHOT</version>
<type>jar</type>
</dependency>
</dependencies>
<build>
<finalName>my-webapp</finalName>
</build>
</project>
- parentセクションを上記サンプルのように追加
- dependencyセクションにmy-jarプロジェクトへの依存関係を追加
これらのプロジェクトをビルドするために、my-appディレクトリでpackageゴールを実行します。
F:\gaoqiao1\my-app>mvn package
コンソールのメッセージからmy-jar→my-webappの順にビルドされていくのがわかります。
my -webapp\target\my-webapp.warを解凍して、パッケージの中身を確認してください。WEB-INF\libの下に、my- jarプロジェクトのアーティファクトであるmy-jar-1.0-SNAPSHOT.jarが、いっしょにパッケージングされているのを確認できるはず です。
プロジェクトのクリーン
プロジェクトをクリーンするにはcleanゴールを実行するだけです。F:\gaoqiao1\my-app>mvn clean