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に書こう