フラットなディレクトリ構成のマルチプロジェクトのリリース

現在のmaven-release-pluginでは、フラットなディレクトリ構成のマルチプロジェクトのリリースはサポートされていない。

「フラットなディレクトリ構成のマルチプロジェクト」とは、例えば次のようなファイル構造をもつプロジェクトである。
(以下、ymir-coreはymir-projectの子であるとする)

ymir
  |
  +-ymir-project
  |  |
  |  +-pom.xml
  |
  +-ymir-core
  |  |
  |  +-pom.xml

これは論理的には以下の構造と同値である。

ymir-project
  |
  +-ymir-core

論理的な構造と同じようなディレクトリ構造にするとEclipseにプロジェクトをインポートできないので、Eclipseで開発している時はフラットなディレクトリ構成のマルチプロジェクトにせざるを得ない。

このマルチプロジェクトをmaven-release-pluginを使ってリリースすると、ほとんどうまくいくのだがタグだけが正しく打たれない。
具体的には、このマルチプロジェクトのルートプロジェクトはymir-projectなのでymir/ymir-projectディレクトリに移動してmvnコマンドを実行することになるのだが、こうするとymir-projectディレクトリだけがtagsの下にcopyされてしまうのである。

本当は

ymir
  |
  +-trunk
      |
      +-ymir-project
      |
      +-ymir-core
  +-tags
      |
      +-ymir-X.Y.Z
         |
         +-ymir-project
         |
         +-ymir-core

のようになって欲しいのだが、実際は

ymir
  |
  +-trunk
      |
      +-ymir-project
      |
      +-ymir-core
  +-tags
      |
      +-ymir-project-X.Y.Z
        ...

のように、ymir-projectディレクトリ以下だけがtagsの下にcopyされてしまう(ymir-coreはコピーされない)。

この問題のためのworkaroundはMRELEASE-261に書かれている。つまりソースツリーのトップディレクトリ(上の例ではymirディレクトリの直下)にpom.xmlを置いて、そのpom.xmlの<module>タグで実際のルートプロジェクト(上の例ではymir-project)のエントリを書けば良い。ymir-projectの親POMをこの便宜上のPOMlにする必要はない。

この結果、ディレクトリツリーはこうなる。

ymir
  |
  +-pom.xml ←便宜上追加
  |
  +-ymir-project
  |  |
  |  +-pom.xml
  |
  +-ymir-core
  |  |
  |  +-pom.xml

便宜上追加したpom.xmlはこのような感じである。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.seasar.ymir</groupId>
  <artifactId>ymir</artifactId>
  <packaging>pom</packaging>
  <version>1.0.0-RC1-SNAPSHOT</version>
  <name>Ymir Project Root</name>
  <scm>
    <connection>
      scm:svn:https://www.seasar.org/svn/sandbox/ymir/component/trunk/
    </connection>
    <developerConnection>
      scm:svn:https://www.seasar.org/svn/sandbox/ymir/component/trunk/
    </developerConnection>
    <url>
      http://svn.seasar.org/browse/component/trunk/?root=sandbox.ymir
    </url>
  </scm>
  <distributionManagement>
    <repository>
      <uniqueVersion>false</uniqueVersion>
      <id>maven.seasar.org</id>
      <name>The Seasar Foundation Maven2 Repository</name>
      <url>dav:https://www.seasar.org/maven/maven2</url>
    </repository>
    <snapshotRepository>
      <uniqueVersion>true</uniqueVersion>
      <id>maven.seasar.org</id>
      <name>The Seasar Foundation Maven2 Snapshot Repository</name>
      <url>dav:https://www.seasar.org/maven/maven2-snapshot</url>
    </snapshotRepository>
  </distributionManagement>
  <modules>
    <module>ymir-project</module>
  </modules>
</project>

ポイントは、<module>タグの追加の他に<scm>タグと<distributionManagement>タグを追加しておくこと。要するにmaven-release-pluginにSubversionリポジトリの在りかと成果物のデプロイ先を教えてあげる必要があるのである。
なおこのpom.xmlのartifactIdは何でも構わないが、release:prepareゴールで尋ねられるタグのラベル名のデフォルト値として使われるため、マルチプロジェクトのソースツリー全体につけたい名前を指定しておくと楽かもしれない。
上の例では「ymir」としているので、リリース後のタグの状態は以前書いた「こうなってほしい」という状態になる。