倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

POM ファイルを書こう! 其ノ六 - POM ファイルの継承

今回は POM ファイルが「Project Object Model」であることの意味の1つ、POM ファイルの継承(Inheritance)を見ていきましょう(一覧)。

どんなときに使う?


POM ファイルの継承によって、(通常のオブジェクト指向設計にあるように)複数の POM ファイルに重複したコード(設定)を1つの継承元の POM ファイルに集約することができます。 これによって、設定の管理が容易になります。

ちなみに、継承されるのは「プロジェクトの設定(もしくは環境)」であって、「プロジェクト」*1や「プロジェクトの成果物」ではありませんので。 念のため。

どう使う?


手順は以下の通り:

  1. 親プロジェクトを作成する
  2. 親プロジェクトを(ローカル・リポジトリへ)インストールする
  3. 子プロジェクトの POM ファイルで親プロジェクトを指定する

1. 親プロジェクトを作成する

親プロジェクトとなるのは、成果物が POM ファイルだけのプロジェクトです。 この POM ファイルは、基本的には通常の POM ファイルと同じですが、packaging を pom に指定する箇所だけが異なります:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sample</groupId>
  <artifactId>parent-sample</artifactId>
  <version>1.0</version>
  <!-- <packaging> を指定する -->
  <packaging>pom</packaging>
</project>

2. 親プロジェクトをインストールする

親プロジェクトをローカル・リポジトリへインストールする方法は、通常のプロジェクトのインストール方法と同じです。 コマンド・プロンプトを立ち上げ、親プロジェクトのルートフォルダ上へ移動して、以下のコマンドを実行して下さい:

mvn install

3. 子プロジェクトの POM ファイルで親プロジェクトを指定する

親プロジェクトの指定の仕方は、「project/parent」要素で行います。 そこで設定するものは、成果物を一意的に識別する3つ組、groupId, artifactId, version です:

<project>
  <!-- ここで親プロジェクトを指定 -->
  <parent>
    <groupId>org.sample</groupId>
    <artifactId>parent-sample</artifactId>
    <version>1.0</version>
  </parent>

  <modelVersion>4.0.0</modelVersion>
  <artifactId>sample</artifactId>
</project>

どう処理される?


POM Reference によると、親 POM に定義されている以下の要素が、子 POM に受け継がれるとあります:

  • dependencies
  • developers and contributors
  • plugin lists
  • reports lists
  • plugin executions with matching ids
  • plugin configuration

ただし、その他にも

  • groupId
  • version

受け継がれるようです*2。 一方、packaging は継承されません。 子 POM で何も指定しなければ、jar が設定されていると見なされます。

Super POM


Java ではすべてのオブジェクトが java.lang.Object を継承しているのと同様、任意の Maven2 プロジェクトの POM ファイルは1つの特定の POM ファイルsuper POM」を継承しています。

repositories や build 等の設定のデフォルト値は、この「super POM」に設定されている値になっています。

Apache Maven 2.0入門 Java・オープンソース・ビルドツール

Apache Maven 2.0入門 Java・オープンソース・ビルドツール

*1:「プロジェクトを継承する」というのが「プロジェクトの設定(環境)」を継承するという意味に受け取れる人は、継承するのは「プロジェクト」であると思ってもかまいませんが。

*2:version が継承されることを利用すれば、一連のプロジェクトのバージョンを管理するのに役立てることが出来ます。