maven2導入TIPSその1〜孫依存の強制排除

序を書いてから余裕で10日放置してやっとその1。
結構長期間のデスマが一昨日からの徹夜作業でほぼ終了したので、今後はもうちょっと書ける…はず。
だけど、来週から子供が保育園に通いはじめ、朝は送りという大役が待っているから平穏なのは今週だけかもしれないが…

ということでTIPSその1、最もハマッた「孫依存の強制排除」です。
自プロジェクトが依存している「子依存プロジェクト」が依存している「孫依存プロジェクト」の事です。
こういう依存性を自動で解決してくれるのが、maven2様の素晴らしいところ!なんですが…
まずは↓を見てください。「PDFが出力したくて」http://www.jasperforge.org/jaspersoft/opensource/business_intelligence/jasperreports/に依存してみました。

		<dependency>
			<groupId>jasperreports</groupId>
			<artifactId>jasperreports</artifactId>
			<version>1.3.3</version>
			<exclusions>
				<exclusion>
					<artifactId>hibernate</artifactId>
					<groupId>org.hibernate</groupId>
				</exclusion>
				<exclusion>
					<artifactId>jcommon</artifactId>
					<groupId>jfree</groupId>
				</exclusion>
				<exclusion>
					<artifactId>jfreechart</artifactId>
					<groupId>jfree</groupId>
				</exclusion>
				<exclusion>
					<artifactId>poi-2.0-final</artifactId>
					<groupId>poi</groupId>
				</exclusion>
				<exclusion>
					<artifactId>servlet-api</artifactId>
					<groupId>javax.servlet</groupId>
				</exclusion>
				<exclusion>
					<artifactId>xml-apis</artifactId>
					<groupId>xml-apis</groupId>
				</exclusion>
				<exclusion>
					<artifactId>jdtcore</artifactId>
					<groupId>eclipse</groupId>
				</exclusion>
				<exclusion>
					<artifactId>groovy-all</artifactId>
					<groupId>groovy</groupId>
				</exclusion>
				<exclusion>
					<artifactId>ant</artifactId>
					<groupId>ant</groupId>
				</exclusion>
			</exclusions>
		</dependency>

な、長!長い!そしてうざい!しょぼいプロジェクトのPOM全体ぐらいあるわ!
長いので抜粋すると↓が「子プロジェクトが依存している孫依存を排除する」方法で、これに指定した依存性は強制的に排除されます。

			<exclusions>
				<exclusion>
					<artifactId>hoge</artifactId>
					<groupId>fuga</groupId>
				</exclusion>
			</exclusions>

これを知らずにmaven2便利だなーと、気軽にwar作ると20MBとかあって、「!?」と展開して見てみるとhibernateやらgroobyやらPDFとはまったく関係の無いものからant、jdtcoreみたいなおよそアプリケーションに必要な事自体超レアなものまでwarに入っているワケですよ。衝撃です。

jasperreports自体はすごいライブラリですが、optional依存を知らないんでしょうね(次に書きます)…こんだけpom.xmlが適当だとちょっと信用が…
ちなみにwicket-contrib-dataも同レベルでしたが、こっちはうざくなって社内リポジトリに依存性無しにして単体で突っ込んでしまいました。
ほとんどが無駄依存のときはこういう手もアリですね。

これは極端な例ですが、ちゃんとしたプロジェクト同士でも、依存ライブラリが多いとJ2EE仕様の複数実装がクラスパスに混在して誤動作起こしたりとか、とにかくいろんな問題が起こるんですよ…
結論、今回の孫依存の強制排除は必須です!!

意外と入門サイトやTIPS系のサイトに載って無くて、偶然ブログで見つけたんですが、探すのに苦労しました。
公式サイトもチェックしたんですが、英語弱いんで、探しきれないんですよね…精進せねば。
ちなみに↓にちゃんと載ってます。
POMリファレンスMaven – POM Reference