Mavenでローカルに存在するjarをパッケージしてみる

MavenJavaのビルドを行う際の強力なツールですが
一般的な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からの移行のハードルが低くなりましたよ。