Maven-shade-plugin、uber-jar和重复类

18

我想使用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”使用我的另一个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定义了135个重叠类

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

3个回答

10
首先要做的是尽可能多地排除重叠类的明显原因。例如:
  • 您同时依赖于spring 2.5.6和spring 3.1.4,这将给您带来更多问题,而不仅仅是在shade插件中。设置模块依赖项,以便您只拥有一个版本的spring。如果必须使用依赖项排除(例如您无法控制的传递性依赖项),则请使用它。
  • 一旦解决了依赖项版本之间的冲突,您还可以使用shade插件配置来确定哪些jar文件进入超级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中的所有类。由于它们显然是相同的版本,且重叠的类应该是相同的,因此构建具有重叠类的shaded jar不会损害任何内容(它将使用它最后处理的jar文件中的类)。但是,如果要排除api jar,则构建将更加整洁且稍微快一些。
在shaded jar中保留冲突版本的类的可能性不大。如果确实需要,请注意shade插件还允许重新定位类,具体请参见http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

我在原帖中又添加了一个问题。 - user2148736

7
我发现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] ------------------------------------------------------------------------
jar被spring-context-support引用,这意味着我们可能可以将其排除在外。

1
这个问题重复了这一个,在那里你可以找到更多的例子。
但是如果你确定没有重叠的依赖关系(就像我一样),clean项目可能会有所帮助。有关更多详细信息,请参见此答案

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接