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

我想使用Maven-shade-plugin来创建超级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”用作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

是这个问题,如果是这样,如何解决它还是可以忽略它?

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

  • 你对spring 2.5.6和spring 3.1.4都有依赖关系,这会给你带来比sha-plug插件更多的问题。 设置模块依赖关系,这样你就只有一个版本的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所述。

我发现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项目可能有所帮助。 有关详细信息,请参阅此答案