複数人のチームでの開発では、機能別やレイヤー別に担当者を分けて開発を行います。
ユーザー向けwebapp、管理画面webapp、共通部分jarでの分割、また以前からの例で言えば、データアクセスやロジックを扱うsample-jarと、コントローラ、ビューを扱うsample-webappを別々の人が担当するという分割が考えられます。
このような場合にMaven2では「モジュール」という概念で管理していきます。
ユーザー向けwebapp、管理画面webapp、共通部分jarでの分割、また以前からの例で言えば、データアクセスやロジックを扱うsample-jarと、コントローラ、ビューを扱うsample-webappを別々の人が担当するという分割が考えられます。
このような場合にMaven2では「モジュール」という概念で管理していきます。
<packaging>pom</packaging>
pomプロジェクトという特殊なパッケージングを使うことでモジュールをまとめるプロジェクトを作ることができます。例えば、
sample
プロジェクトにて sample-jar
/ sample-webapp
をまとめて管理する場合、ディレクトリ構成は以下のようになります。+ sample + sample-jar + src + main + java + resources + test + java + resources + target - pom.xml + sample-webapp + src + main + java + resources + webapp + WEB-INF - web.xml + test + java + resources + target - pom.xml - pom.xml
sample
/ sample-jar
/ sample-webapp
それぞれがpom.xmlファイルを持っており、pomプロジェクトであるsample
プロジェクトがinstall/deployされていれば、それぞれをMavenプロジェクトとして成立させることが可能です。それぞれのpom.xmlファイルは以下のようになります。
- sample/pom.xml
<module>
タグを使ってモジュールを登録します。<project> <modelVersion>4.0.0</modelVersion> <groupId>st.happy_camper.sample</groupId> <artifactId>sample</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>sample-jar</module> <module>sample-webapp</module> </modules> </project>
- sample/sample-jar/pom.xml
<parent>
タグで親モジュールを指定します。<project> <parent> <groupId>st.happy_camper.sample</groupId> <artifactId>sample</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>st.happy_camper.sample</groupId> <artifactId>sample-jar</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> </project>
- sample/sample-webapp/pom.xml
<parent>
タグで親モジュールを指定します。<project> <parent> <groupId>st.happy_camper.sample</groupId> <artifactId>sample</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>st.happy_camper.sample</groupId> <artifactId>sample-webapp</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>st.happy_camper.sample</groupId> <artifactId>sample-jar</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
pomプロジェクトのその他の機能
pomプロジェクトには他にも便利な機能があります。設定の共通化
pomプロジェクトのpom.xmlファイルに記述した設定は、基本的にモジュールにも引き継がれます。依存解決とレポジトリやプロジェクトサイト生成で見てきた各情報はモジュールに引き継がれるのでそれぞれのpom.xmlファイルでいちいち記述する必要がなくなり、pom.xmlファイルがスッキリします。
各モジュールで設定を上書き/追加することもできるので、モジュール特有の設定をすることもできます。
上記例でsample/pom.xmlファイルを以下のようにすれば、junit-4.5を
sample-jar
/ sample-webapp
両モジュールで利用できるようになります。<project>
<modelVersion>4.0.0</modelVersion>
<groupId>st.happy_camper.sample</groupId>
<artifactId>sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>sample-jar</module>
<module>sample-webapp</module>
</modules>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.5</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
モジュール側では、groupId / versionも親プロジェクトから引き継ぐことができます。
多段階層
pomプロジェクト配下に、さらにpomモジュールを配置することができます。例えば、全体の共通設定を最上位のpomプロジェクトに、jarモジュールはその配下、warモジュールはさらにwarモジュールの共通設定を行うpomモジュールを準備し、その配下に、といった利用ができます。
+ pom + a-jar + b-jar + war-pom + user-war + admin-war
まとめてビルド
最上位のpomプロジェクトでmvnコマンドを利用するとプロジェクト全体を1回のコマンドでビルドすることができます。もちろん、各階層でビルドするとその階層(以下)のビルド、とすることができます。