LoginSignup
69

More than 5 years have passed since last update.

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

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69