DATE : 2008/04/19 (Sat)
配布用 ZIP ファイルなどのパッケージを構築できる Maven Assembly Plugin を Maven 2.0.9をインストールした後に実行すると、Maven 2.0.8以前とは違ったパッケージができあがってしまいました。
例えば、次のような Assembly Descriptor があったとします。(「...」は省略を表します)
... <dependencySets> <dependencySet> <outputDirectory>/lib</outputDirectory> <outputFileNameMapping>${artifactId}.${extension}</outputFileNameMapping> </dependencySet> </dependencySets> ...
この Assembly Descriptor は、プロジェクトが依存するライブラリなどのプロジェクトを、lib ディレクトリに「(アーティファクト名).(拡張子)」というファイル名で格納するという指定をしています。
ところが、この記述のある Assembly Descriptor を Maven 2.0.9 で実行すると、想定とは異なるファイルが lib ディレクトリに格納されていました。例えば、sample-project というアーティファクト名のプロジェクトがあり、commons-logging というプロジェクトに依存している場合、正しく動作すれば lib ディレクトリの直下に commons-logging.jar というファイルが格納されるはずです。ところが、なぜか sample-project.${extension} というファイルができていました。
Maven Assembly Plugin のページを確かめてみると、Mave Assembly Plugin のバージョンアップによって Assembly Descriptor の仕様が変わったようです。特に、上の例で該当する「outputFileNameMapping」要素の説明には、次のように書いてありました。
Sets the mapping pattern for all dependencies included in this assembly. Default is ${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}. (Since 2.2-beta-2; 2.2-beta-1 uses ${artifactId}-${version}${dashClassifier?}.${extension}) The default value is ${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}.
つまり、Maven Assembly Plugin 2.2-beta-1 と Maven Plugin 2.2-beta2 とでは、 outputFileNameMapping の書き方が異なるということです。
Maven 2.0.9 では Maven Assembly Plugin 2.2-beta-2 が採用されています(Maven 2.0.9 の Super POM)。そのため、自動的に Maven Assembly Plugin も 2.2-beta-2 にバージョンアップされます。そのため、Maven Assembly Plugin の動作変更に対して次のいずれかの方法で対処しなければなりません。
- Assembly Descriptor を Maven Assembly Plugin 2.2-beta-2 の仕様にあわせて書き直す。
- POM に Maven Assembly Plugin 2.2-beta-1 を使うようにバージョンを指定する。
(;^ω^)仕様が変わるなら、Maven のリリースノートに書いてほしかったですね。