Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

Mavenプラグインで外部ライブラリをrepackageする方法

自作ライブラリを配布するときに、ライブラリが依存する外部ライブラリを同梱したい場合があります。しかしフツーに同梱・配布してしまうと、ライブラリを利用するプログラムの依存関係と衝突してしまってトラブルになりかねません。バージョンの違うロギングライブラリの衝突で苦労された方は少なくないのではないでしょうか。

appengineのSDKでは依存するユーティリティライブラリのパッケージを書き換える(repackageする)ことでこの問題を回避しているようです。Mavenで同じようなことができないかなと探したところ、maven-shade-pluginのrelocation機能を使うことで実現することができました。
例えば以下のようにpom.xmlに書いておくと、org.apacheパッケージを自動的にorg.apache.repackagedに書き換えた上で同梱してくれます。バイトコード改変ということでライセンス上利用が難しい場合もあるでしょうが、ライブラリ自作者にはかなり嬉しい機能です。

<project>
...
<build>
<plugins>
...
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-shade-plugin</artifactId>
	<version>1.4</version>
	<executions>
		<execution>
			<phase>package</phase>
			<goals>
				<goal>shade</goal>
			</goals>
			<configuration>
				<relocations>
					<relocation>
						<pattern>org.apache</pattern>
						<shadedPattern>org.apache.repackaged</shadedPattern>
					</relocation>
				</relocations>
			</configuration>
		</execution>
	</executions>
</plugin>
...
</plugins>
</build>
...
</project>