Maven-shade-plugin, uber-jar 和重叠类

2022-09-03 02:15:05

我想使用Maven-shade-plugin来创建uber-jar。但是当我调用命令时,Maven报告有一些重叠的类。我附加了所有有问题的重叠,其中一些是因为库(Log4J)的旧版本和新版本引起的,但其中一些似乎具有相同的类 - 例如javax.mail和mailapi / smtp / imap等。mvn package

在这种情况下,最好的办法是什么?有没有一些关键的方法来决定哪个重叠是安全的忽略哪个需要是正确的?

 - 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”用作Maven依赖项我的另一个Java应用程序 - 我将此应用程序称为“B”。此 B 应用程序使用 javax.mail 版本 1.5.1。此库也使用第一个应用程序。但是当我调用 mvn package 命令时,Maven 注意到 .javax.mail-api-1.5.1.jar, javax.mail-1.5.1.jar define 135 overlappping classes

这是这个问题,如果是这样,如何解决它,或者我可以忽略它吗?


答案 1

首先要做的是尽可能多地删除类重叠的明显原因。例如:

  • 你对spring 2.5.6和spring 3.1.4都有依赖性,这将给你带来比阴影插件更多的问题。设置模块依赖关系,以便您只有一个版本的spring。如有必要,请使用依赖关系排除(假设您有无法控制的传递依赖关系)。
  • 修复依赖版本冲突后,您还可以使用 shade 插件配置配置哪些 jar 进入 uber-jar,如 http://maven.apache.org/plugins/maven-shade-plugin/examples/includes-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 中保留类的冲突版本。如果这样做,shade 插件还允许重新定位类,如 http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html


答案 2

我发现 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中引用的,这表明我们可以排除它。


推荐