【问题标题】:Maven-shade-plugin, uber-jar and overlapping classes [duplicate]Maven-shade-plugin、uber-jar 和重叠类 [重复]
【发布时间】:2013-11-28 00:28:36
【问题描述】:

我想使用 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 版本 1.5.1。这个库也使用了第一个应用程序。但是当我调用 mvn package 命令时,Maven 注意到 javax.mail-api-1.5.1.jar, javax.mail-1.5.1.jar define 135 overlappping classes

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

【问题讨论】:

    标签: java maven dependencies overlap


    【解决方案1】:

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

    • 您同时依赖于 spring 2.5.6 和 spring 3.1.4,这会给您带来比仅在 shade 插件中更多的问题。设置你的模块依赖,这样你就只有一个版本的 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 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] ------------------------------------------------------------------------
    

    aopalliance jar 被 spring-context-support 引用,这表明我们可以排除它。

    【讨论】:

      【解决方案3】:

      此问题与this one 重复,您可以在其中找到更多示例。

      但如果您确定没有重叠的依赖项(就像我有的那样),cleaning 项目可能会有所帮助。见this answer for more details

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-30
        • 2012-02-07
        • 2014-09-05
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        相关资源
        最近更新 更多