2013-11-14 24 views
10

Maven-shade-pluginを使用してuber-jarを作成したいと考えています。しかし、mvn packageというコマンドを呼び出すと、いくつかのオーバーラップするクラスがあるとMavenは報告します。すべての問題のあるオーバーラップを添付していますが、ライブラリの古いバージョンと新しいバージョン(Log4J)が原因で発生しますが、その一部は同じクラスを持つようです。 javax.mailとmailapi/smtp/imapなどがあります。Maven-shade-plugin、uber-jarおよびオーバーラップクラス

この状況では、どうすればよいですか?重複が正しいものを無視するのが安全であるかどうかを決めるには、いくつかの鍵がありますか?

- 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:このアプリケーション "" 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

この問題はありますか?それを解決するにはどうすればいいですか、それとも無視できますか?

答えて

2

最初に行うことは、できるだけ重複するクラスの明白な原因の多くを削除することです。例:

  • 春2.5.6と春3.1.4の両方に依存しているため、陰影プラグインだけでなく、さらに多くの問題が発生します。モジュールの依存関係を設定して、スプリングのバージョンが1つだけになるようにします。あなたが(あなたが制御しない推移的な依存関係を持っている)必要がある場合は、依存関係の除外を使用してください。
  • 依存バージョンの衝突が固定されたらhttp://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html
  • 瓶の中で説明したように、あなたもおそらく、重複瓶からクラスのすべてが含まれている、日陰のプラグインの設定とユーバージャーに入っているjarファイルを設定することができます。
    • 私は、commons-logging-1.1.3.jarには、commons-logging-api-1.1.jarで宣言されたクラスのスーパーセットがあると思われます。この場合、api jarを除外できます。
    • 編集した質問に応答して、javax.mail-1.5.1.jarには、javax.mail-api-1.5.1.jarのクラスのスーパーセットが含まれています。これらは明らかに同じバージョンであり、オーバーラップするクラスは同一でなければならないので、重なり合ったクラスを持つ影付きのjarファイルを作成することには問題ありません(最後に処理するjarからクラスを取得します)。しかし、api jarを除外するとビルドはより細かくなり、わずかに速くなります。

それはあなたが日陰瓶の中のクラスの競合バージョンを保持する必要があるとは考えにくいです。もしあなたがそうするならば、シェードプラグインはまた、http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

+0

私は元の投稿にもう1つの質問を追加しました。 – user2148736

3

で説明されているように、クラスの再配置を可能にします。maven dependency tree pluginはどこから来た入れ子依存性があるかを知り、除外を追加するのに非常に便利です。

$ **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] ------------------------------------------------------------------------ 

アオパランスジャーは、おそらくそれを除外することができることを示すスプリングコンテキストサポートから参照されています。

0

この質問は、this oneと重複しています。

しかし、(私のように)重複している依存関係がないと確信できる場合は、cleanプロジェクトが役に立ちます。 this answer for more details