17

Maven-shade-plugin を使用して uber-jar を作成したいと考えています。しかし、mvn packageコマンド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: 

編集:このアプリケーション「A」は、別の Java アプリケーションを Maven 依存関係として使用します。このアプリケーションを「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.

この問題はありますか?もしそうなら、どうすれば解決できますか?それとも無視できますか?

4

3 に答える 3

9

最初にすべきことは、重複するクラスの明らかな原因をできるだけ多く取り除くことです。例えば:

  • spring 2.5.6 と spring 3.1.4 の両方に依存しているため、shade プラグインだけでなく、より多くの問題が発生します。モジュールの依存関係を設定して、Spring のバージョンが 1 つだけになるようにします。必要に応じて依存関係の除外を使用します (制御できない推移的な依存関係があるとします)。
  • 依存関係のバージョンの競合が修正されたら、 http://maven.apache.org/plugins/maven-shade-plugin/examples/includesで説明されているように、shade プラグイン構成を使用してどの jar を uber-jar に入れるかを構成することもできます。 -excludes.html
  • 一部の jar には、重複する 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 を除外すると、ビルドはより整然とし、わずかに高速になります。

シェーディングされた jar 内のクラスの競合するバージョンを保持する必要がある可能性はほとんどありません。その場合、http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.htmlで説明されているように、shade プラグインはクラスの再配置も許可します。

于 2013-11-14T21:14:43.733 に答える
6

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 から参照されており、除外できる可能性があることを示しています。

于 2015-05-08T09:55:51.387 に答える