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

  • 33
    Like
  • 0
    Comment
More than 1 year has 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に書こう