maven-assembly-pluginでSNAPSHOTバージョンの依存ライブラリ

maven-assembly-plugin は、依存ライブラリのjarファイル等をまとめて配布用のファイルを作成してくれるプラグインです。dependencyで指定したライブラリにSNAPSHOTのバージョンがある場合の動作で困った事があったので対応方法をメモしておきます。Mavenおよびプラグインのバージョンに依存する可能性があります。

現象としては、dependencyにSNAPSHOTバージョンのライブラリが存在する場合に、jarのマニフェストファイルの Class-Path で指定するファイル名は、moduleA-0.0.1-SNAPSHOT.jarという形式なのですが、maven-assembly-pluginがコピーするjarファイル名はmoduleA-0.0.1-20110906.041435-49.jarのようにタイムスタンプが含まれる形式になり、結果としてアプリケーションが起動しません。

マルチモジュール構成でmaven-assembly-pluginを使っているモジュールから別モジュール(moduleA)を参照しています。ただし、moduleAをローカルでビルドしている場合には"-SNAPSHOT"のjarがコピーされる問題ないのですが、リモートのあるmavenリポジトリからmoduleAのjarをダウンロードすると発生します。

対策としては、以下いずれかでよさそうです。

maven-assembly-pluginの設定での対応

maven-assembly-pluginのディスクリプタで、ファイル名のフォーマットを指定することができます。outputFileNameMappingです。バージョン部分を"${artifact.baseVersion}"にすることでタイムスタンプを含まない形式になります(デフォルトでは"${artifact.version}"でタイムスタンプを含みます)。

<dependencySets>
    <dependencySet>
        <outputFileNameMapping> ${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
        <!-- .... -->
    </dependencySet>
</dependencySets>

maven-jar-pluginの設定での対応

maven-jar-pluginのconfigurationにて、useUniqueVersionsを使って制御します。useUniqueVersions=trueにするとマニフェストの方でもタイムスタンプが含まれる形式になります。

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
	<finalName>${pom.artifactId}</finalName>
	<archive>
		<manifest>
			<!-- .... -->
			<useUniqueVersions>true</useUniqueVersions>
			<addClasspath>true</addClasspath>
			<classpathPrefix>lib</classpathPrefix>
		</manifest>
	</archive>
</configuration>

falseにするとmaven-assembly-pluginの方出"-SNAPSHOT"付きのファイル名でコピーしてくれるかと期待したのですが、そうではない様です。。