Maven2 Eclipse Plugin 再調査

4月から再びJavaの仕事をやることになったので、開発環境を再度調査しています。
id:da-yoshi:20070421:1177143777の日記で、Maven2 Eclipse PluginによるWTPとの連携を調べましたが、今回改めて調べたところ、より便利になってることがわかりました。
今回書いてみたpom.xmlはこんな感じです。次の仕事がStruts+Spring+Hibernateのシステムなので、この3つのFWをWTP上で使う組み合わせを書いてみました。

<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>springmaven</groupId>
	<artifactId>springmaven</artifactId>
	<packaging>war</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>springmaven Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>struts</groupId>
			<artifactId>struts</artifactId>
			<version>1.2.9</version>
			<exclusions>
				<exclusion>
					<groupId>xml-apis</groupId>
					<artifactId>xml-apis</artifactId>
				</exclusion>
				<exclusion>
					<groupId>xalan</groupId>
					<artifactId>xalan</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
			<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>3.3.2.GA</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
			</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc-struts</artifactId>
			<version>2.5.2</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>2.5.2</version>
		</dependency>
		<dependency>
			<groupId>javaee</groupId>
			<artifactId>javaee-api</artifactId>
			<version>5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.4</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<finalName>springmaven</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.5</source>
					<target>1.5</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-eclipse-plugin</artifactId>
				<configuration>
					<downloadSources>true</downloadSources>
					<downloadJavadocs>true</downloadJavadocs>
					<wtpversion>2.0</wtpversion>
					<additionalProjectFacets>
						<sun.facet>9</sun.facet>
					</additionalProjectFacets>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<repositories>
		<repository>
			<id>java.net</id>
			<url>http://download.java.net/maven/1</url>
			<layout>legacy</layout>
		</repository>
		<repository>
			<id>jboss-maven2</id>
			<url>http://repository.jboss.org/maven2</url>
		</repository>
	</repositories>
</project>

maven-eclipse-pluginのプラグイン記述をpomに書いてあげることによって、コマンドで長いオプションをつける必要はなくなります。ライブラリの組み合わせをいろいろ変えて再実行したいときに便利です。
調べていてわかったのは、まずmaven-compiler-pluginで利用するJDKのバージョンを指定すること。これによってProject FacetsのJavaバージョンが決定されます。次に、利用するバージョンのServlet APIのjarをdependencyに加えること。これでProject FacetsのDynamic Web Modulesのバージョンが決まります。servlet-apiのjarはGlassFishリポジトリGeronimo関連で公開されています。javaee-apiのjarでも試してみましたが、servlet-apiのjarが入ってないと認識してくれないみたいです。その他固有のProjectFacetsも、pomに書いておくことによって自動で定義してくれます。
こんなかんじで記述しておけば、後はライブラリ構成を変更するたびに「mvn eclipse:clean eclipse:eclipse」とコマンド入力すれば大丈夫。Maven2でライブラリ管理しつつ、WTPによるAPサーバとの連携機能を十分に使うことが出来ます。
今回は調べていませんが、earプロジェクトをターゲットにした連携もサポートしているみたいですね。機会があれば試してみたいと思います。
id:da-yoshi:20070426:1177550114で書いた、Maven2の推移的依存関係の問題は、最新バージョンでも特に変わっていないみたいです。今回の例でも、commons-loggingの定義が複数FWで被っており、古いバージョンのjarがダウンロードされてしまいました。依存関係を自分で調べて、不必要な依存関係は自分でexclusionの定義を書かなければいけない・・・という注意点は変わってないみたいですね。