MavenはJavaのビルドを行う際の強力なツールですが
一般的なMavenのお作法では、公開サーバーからjarを取ってくることになっています。
個人的には、公開サーバーより取得するよりも、SVNみたいな構成管理ツールから
とってきて全部解決できるようにしたい。
コンパイル&jarに固める時にはpom.xmlに
<dependency> <groupId>my-group</groupId> <artifactId>junit-4.5.jar</artifactId> <scope>system</scope> <systemPath>${basedir}/lib/junit-4.5.jar</systemPath> </dependency>
と記述すれば、ローカルに存在するjarを参照します。
Eclipseのプロジェクト直下にpom.xmlがあれば、
{Eclipseのプロジェクトディレクトリ}/lib/junit-4.5.jar
を見にいくようになります。
ですがこの方式だと、warに固める時「WEB-INF/lib」に
コピーしてくれません。
ファイルのコピー処理をAntで書く?と思ったんですが、
やっぱりそんなプラグインあるわけですよ。
Maven Dependency plugin - Introduction
POMの書き方はこんな感じ
<project> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>compile</phase> <goals> <goal>copy-dependencies</goal> </goals> </execution> </executions> <configuration> <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory> </configuration> </plugin> </plugins> </build> [...] </project>
これで、compile終了時にこのコピー処理が始まります。
ただ、このままだと全ての依存jarがコピー対象になってしまいます。
servlet.jarやJUnitのjarのようにwarの中に含みたくないjarが存在する場合、
除外するファイルを指定することもできます。
<project> [...] <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>compile</phase> <goals> <goal>copy-dependencies</goal> </goals> </execution> </executions> <configuration> <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory> <excludeArtifactIds>junit-4.5.jar</excludeArtifactIds> </configuration> </plugin> </plugins> </build> [...] </project>
依存jarのartifactIdが、「junit-4.5.jar」であるものを除外して
${project.build.directory}/${project.build.finalName}/WEB-INF/lib
に依存jarをコピーします(カンマ区切りで複数指定もできます)。
include,excludeの指定は
- type (war, jar etc)
- scope (runtime, test, etc)
- classifier (jdk14, sources, etc)
- groupId
- artifactId
ができるみたいです。
Mavenでビルドすることのメリットは
設定ファイルをがりごり書かずに様々なレポートの出力ができることだと思っています。
これでAntからの移行のハードルが低くなりましたよ。