Java
Maven

pom.xmlの各要素デフォルト値と変数置換について

More than 3 years have passed since last update.

Mavenドキュメントの以下ページに関するメモです。

Introduction to the POM

http://maven.apache.org/guides/introduction/introduction-to-the-pom.html


Project Inheritance と Project Aggregation は端折ります :p



そもそもPOMって何よ?

Project Object Modelです。プロジェクト自身の情報(e.g., プロジェクト識別子, バージョン番号, 開発者名, etc...)とビルド設定(e.g., 成果物ファイル名, ソースディレクトリ, 出力ディレクトリ, 依存ライブラリ, etc...)などを記述したxmlファイルで、これを入力にMavenさんがせっせと動きます。


Super POM

全てのPOMはSuper POMを継承します。自分のプロジェクトのpom.xmlで指定しない値はSuper POMで定義されている値となります。


各要素デフォルト値

つまりSuper POMの値を確認すればOKという話。例えば<build>以下のデフォルト値を一部抜粋するとこの通り。

<build>

<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
</build>

${project.artifactId}というのは変数置換で、これは後述します。


Minimal POM

継承されるデフォルト値以外で、必ず自分のプロジェクトで設定しなければならない値は4つのみ。最小のPOM記述は以下となる。

<project>

<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</project>

デフォルト値の一つにパッケージングタイプ(e.g., jar, war, ear, etc...)がある。全てのMavenプロジェクトはパッケージングタイプを持ち、そのデフォルトはjarになる。


でもこれはSuper POMに記述されていない値なので、その定義などは後で調べよう...



pom.xml内の変数置換

DRY(Don't Repeat Yourself)の精神で、複数箇所に書かなければいけないような値を変数化したり、pre-definedな変数をpom.xml内で利用できる。

<version>${project.version}</version>

${...}が変数置換される。


Project Model Variables

pom.xml内のSingle value elementな値は変数として参照できる。例えば、


  • ${project.groupId}

  • ${project.version}

  • ${project.build.sourceDirectory}

のように、これらの値はproject.とプリフィクスを持つ。


Special Variables

pom.xml内に記述されているものではない特別な変数。

変数名

project.basedir
プロジェクトのディレクトリパス

project.baseUri
プロジェクトのディレクトリURI

maven.build.timestamp
ビルドを開始時点のタイムスタンプ


Properties

ユーザー定義変数として利用できる。

<project>

...
<properties>
<mavenVersion>2.1</mavenVersion>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>${mavenVersion}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>${mavenVersion}</version>
</dependency>
</dependencies>
...
</project>

/project/properties以下に任意の要素名で複数定義可能。特段のプリフィクスがないことがポイントか。


追記: Environment variables

以下ページに変数置換で使えるものの詳細が書いてある。

http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide

${env.M2_HOME}のようにenv.プリフィクスで環境変数も利用できる。


まとめ


  • POMの各要素デフォルト値が知りたくなったらSuper POMを確認しよう

  • 変数置換を利用してpom.xmlはDRYに書こう