ぺーぺーSEのブログ

備忘録・メモ用サイト。

Maven2、Maven3のPOMの書き方まとめ〜ビルド設定編〜

参考:http://maven.apache.org/pom.html

blog.pepese.com


■概要

<project ...>

  <build>
    <defaultGoal>...</defaultGoal>
    <directory>...</directory>
    <finalName>...</finalName>
    <filters>
      <filter>...</filter>
    </filters>

    <resources>
      <resource>
        <targetPath>...</targetPath>
        <filtering>...</filtering>
        <directory>...</directory>
        <includes>
          <include>...</include>
        </includes>
        <excludes>
          <exclude>...</exclude>
        </excludes>
      </resource>
    </resources>
    <testResources>
      ...
    </testResources>

    <plugins>
      <plugin>
        <groupId>...</groupId>
        <artifactId>...</artifactId>
        <version>...</version>
        <extensions>...</extensions>
        <inherited>...</inherited>
        <configuration>
          <classifier>...</classifier>
        </configuration>
        <dependencies>...</dependencies>
        <executions>...</executions>
      </plugin>
    </plugins>

    <pluginManagement>
      <plugins>...</plugins>
    </pluginManagement>

    <sourceDirectory>...</sourceDirectory>
    <scriptSourceDirectory>...</scriptSourceDirectory>
    <testSourceDirectory>...</testSourceDirectory>
    <outputDirectory>...</outputDirectory>
    <testOutputDirectory>...</testOutputDirectory>
  </build>

  <profiles>
    <profile>
      <!-- "Profile Build" contains a subset of "Project Build"s elements -->
      <build>...</build>
    </profile>
  </profiles>

</project>

defaultGoal、directory、finalName、filter要素

  • defaultGoal
    • 設定が無い場合、プラグインのデフォルトのgoal、phaseが適用される。
    • 設定する場合、mvnコマンドで実行するgoalを設定する。(例:mvn jar:jar)
    • 個人的にはこいつを設定する場面に出くわしたことがない。。。
  • directory
    • プラグインが作成したファイルを出力するディレクトリを設定する。
    • デフォルトは「${basedir}/target」。
  • finalName
    • 最終的にビルドされた際のまとめられたプロジェクトの拡張子を省いた名前。
    • デフォルトは「${artifactId}-${version}」。
  • filter
    • 「name=value」形式でプロパティを設定した*.propertiesファイルの読み込み設定。
    • 読み込んだプロパティはPOMファイル内では「${name}」で参照できる。
    • デフォルトは「${basedir}/src/main/filters/」。

■設定例

<build>
  <defaultGoal>install</defaultGoal>
  <directory>${basedir}/target</directory>
  <finalName>${artifactId}-${version}</finalName>
  <filters>
    <filter>filters/filter1.properties</filter>
  </filters>
  ...
</build>

resources、testResources要素

  • resources
    • プロジェクトが使用するリソースに関する設定を行う。
  • targetPath
    • プロジェクトリソースのターゲットパスを設定する。
    • デフォルトはベースディレクトリ。
  • filtering
    • プロジェクトリソースをフィルタリングするかどうか設定する。
    • デフォルトは「false」。
  • directory
    • 設定ファイルを置くディレクトリを設定する。
    • デフォルトは「${basedir}/src/main/resources」。
  • includes
    • ターゲットパスがディレクトリの場合、リソースに含むファイル名を設定する。
  • excludes
    • ターゲットパスがディレクトリの場合、リソースに含まないファイル名を設定する。
  • testResources
    • プロジェクトが使用するリソースに関する設定を行う。
    • resourcesとは異なり、testフェイズでのみ使用する設定ファイル類の設定を行う。
    • directoryのデフォルトは「${basedir}/src/test/resources」。

■設定例

<resources>
  <resource>
    <targetPath>META-INF/plexus</targetPath>
    <filtering>false</filtering>
    <directory>${basedir}/src/main/plexus</directory>
    <includes>
      <include>configuration.xml</include>
    </includes>
    <excludes>
      <exclude>**/*.properties</exclude>
    </excludes>
  </resource>
</resources>
<testResources>
  ...
</testResources>

plugins要素

Mavenプラグインに関する設定を行う。
親POMに本要素を設定し、子POMが継承した場合、子POMには設定が継承される。

  • extensions
    • プラグインの拡張をロードするかどうか設定する。
    • デフォルトは「false」。
  • inherited
    • プラグインのPOMのconfigurationを継承するかどうか設定する。
    • デフォルトは「true」。
  • configuration
    • 個々のプラグインの設定を記述する。

■設定例

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.0</version>
    <extensions>false</extensions>
    <inherited>true</inherited>
    <configuration>
      <classifier>test</classifier>
    </configuration>
    <dependencies>...</dependencies>
    <executions>...</executions>
  </plugin>
</plugins>
<plugins>
  <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.1</version>
    <executions>
      <execution>
        <id>echodir</id>
        <goals>
         <goal>run</goal>
        </goals>
        <phase>verify</phase>
        <inherited>false</inherited>
        <configuration>
          <tasks>
            <echo>Build Dir: ${project.build.directory}</echo>
          </tasks>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>

pluginManagement要素

Mavenプラグインに関する設定のみを行う。
親POMに本要素を設定し、子POMが継承した場合、子POMには設定が継承されない。
ただし、子POMのplugins-plugin要素において、親POMのpluginManagement要素で設定したプラグインのgroupIdとartifactIdのみを設定することで機能が継承される。
親POMのpluginManagement要素において子POMで使用する可能性があるプラグインの設定のみを行っておき、子POMでそのプラグインを使用するかどうか選択できる。
■設定例(親POM)

<pluginManagement>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.2</version>
      <executions>
        <execution>
          <id>pre-process-classes</id>
          <phase>compile</phase>
          <goals>
            <goal>jar</goal>
          </goals>
          <configuration>
            <classifier>pre-process</classifier>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</pluginManagement>

■設定例(子POM)

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
  </plugin>
</plugins>

Extensions

<build>
  ...
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ftp</artifactId>
      <version>1.0-alpha-3</version>
    </extension>
  </extensions>
  ...
</build>

sourceDirectory、scriptSourceDirectory、testSourceDirectory、outputDirectory、testOutputDirectory

  • sourceDirectory
    • ソースファイルを配置するディレクトリを設定する。
  • scriptSourceDirectory
    • スクリプトのディレクトリを設定する。
  • testSourceDirectory
    • テスト用ソースファイルを配置するディレクトリを設定する。
    • 通常はJUnitのテストコードを配置する。
  • outputDirectory
    • ソースファイルのコンパイル結果であるクラスファイルを出力するディレクトリを設定する。
  • testOutputDirectory
    • テスト用ソースファイルのコンパイル結果であるクラスファイルを出力するディレクトリを設定する。

■デフォルト設定

<build>
  <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
  <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
  <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
  <outputDirectory>${basedir}/target/classes</outputDirectory>
  <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
</build>

プラグイン参考サイト:
http://www.nulab.co.jp/kousei/chapter6/04.html
http://www.nulab.co.jp/kousei/chapter6/05.html