Maven-shade-pluginを使用してuber-jarを作成したいと思います。しかし、私がmvn package
command Mavenは、いくつかの重複するクラスがあることを報告します。問題のあるオーバーラップをすべて添付しています。ライブラリの古いバージョンと新しいバージョン(Log4J)が原因で発生するものもありますが、同じクラスを持っているように見えるものもあります。 javax.mailおよびmailapi/smtp/imapなど。
この状況で何をするのが最善ですか?どのオーバーラップが正しい必要があるかを無視しても安全であるかどうかを判断するための重要な方法はありますか?
- mailapi-1.4.3.jar, javax.mail-1.5.0.jar define 166 overlappping classes
- spring-2.5.6.SEC03.jar, spring-tx-3.1.4.RELEASE.jar define 176 overlappping classes:
- spring-beans-3.1.4.RELEASE.jar, spring-2.5.6.SEC03.jar define 283 overlappping classes:
- slf4j-log4j12-1.7.5.jar, slf4j-impl-2.0-beta2.jar define 3 overlappping classes:
- spring-2.5.6.SEC03.jar, spring-context-support-3.1.4.RELEASE.jar define 55 overlappping classes:
- aopalliance-1.0.jar, spring-2.5.6.SEC03.jar define 9 overlappping classes:
- imap-1.5.0.jar, javax.mail-1.5.0.jar define 87 overlappping classes:
- commons-logging-api-1.1.jar, commons-logging-1.1.3.jar define 19 overlappping classes:
- spring-2.5.6.SEC03.jar, spring-core-3.1.4.RELEASE.jar define 161 overlappping classes:
- spring-2.5.6.SEC03.jar, spring-context-3.1.4.RELEASE.jar define 326 overlappping classes:
- log4j12-api-2.0-beta3.jar, log4j-1.2.17.jar define 23 overlappping classes:
- spring-aop-3.1.4.RELEASE.jar, spring-2.5.6.SEC03.jar define 237 overlappping classes:
- spring-jdbc-3.1.4.RELEASE.jar, spring-2.5.6.SEC03.jar define 239 overlappping classes:
- quartz-1.8.6.jar, quartz-jobs-2.2.1.jar define 15 overlappping classes:
- smtp-1.5.0.jar, javax.mail-1.5.0.jar define 17 overlappping classes:
- spring-asm-3.1.4.RELEASE.jar, spring-2.5.6.SEC03.jar define 31 overlappping classes:
EDIT:このアプリケーション "A"はMavenの依存関係として別のアプリケーションを使用しますJavaアプリケーション-このアプリを "B"と呼びます。このBアプリケーションはjavax.mailを使用します。 ver 1.5.1。このライブラリも最初のアプリケーションを使用しますが、mvn packageコマンドを呼び出すと、Mavenはjavax.mail-api-1.5.1.jar, javax.mail-1.5.1.jar define 135 overlappping classes
。
この問題はありますか?もしそうなら、それを解決する方法ですか、それとも無視できますか?
最初に行うことは、クラスの重複の明らかな原因をできるだけ多く取り除くことです。例えば:
シェーディングされたjarに競合するバージョンのクラスを保持する必要がある可能性はほとんどありません。そうした場合、 http://maven.Apache.org/plugins/maven-shade-plugin/examples/class-relocation.html で説明されているように、シェードプラグインはクラスの再配置も許可します。
maven依存関係ツリープラグイン は、ネストされた依存関係がどこから来ているのかを見つけて、その除外を追加するのに非常に便利であることがわかりました。
$ **mvn dependency:tree -Dverbose -Dincludes=aopalliance**
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building petshop cli 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ cli ---
[INFO] com.sample.petshop:cli:jar:1.0
[INFO] \- **org.springframework:spring-context**:jar:4.1.3.RELEASE:compile
[INFO] \- org.springframework:spring-aop:jar:4.1.3.RELEASE:compile
[INFO] \- **aopalliance:aopalliance**:jar:1.0:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.865s
[INFO] Finished at: Fri May 08 15:12:01 IST 2015
[INFO] Final Memory: 14M/223M
[INFO] ------------------------------------------------------------------------
Aopalliance jarはspring-context-supportから参照されており、除外できる可能性があることを示しています。
この質問は この質問 と重複しており、他の例を見つけることができます。
しかし、(私が持っていたように)重複する依存関係がないと確信している場合は、clean
ingプロジェクトが役立つ可能性があります。詳細については、 この回答を参照してください