当前位置: 首页 > 面试题库 >

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

朱梓
2023-03-14
问题内容

我想使用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

是这个问题,如果是的话,该如何解决?还是可以忽略呢?


问题答案:

要做的第一件事是尽可能消除重叠类的许多明显原因。例如:

  • 您对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
  • 一些罐子可能包含重叠罐子中的所有类。
    • 我怀疑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中所述



 类似资料:
  • 我还设置了exec maven插件,运行按预期运行程序。 下面是如何设置exec maven插件的

  • Maven shade plugin 为 Maven 提供了 Jar 打包的神器,包括将所依赖的 jar 包都打包到一起。

  • 我有一个项目,它使用maven-assembly-plugin打包了几个(可执行的jar)程序集--基本上相同的代码,但针对不同的客户机使用了不同的数据集。 我需要在可执行jar中使用spring,由于spring中的文件命名,我需要使用maven-shade-plugin创建jar。这工作很好,我可以创建可执行的jar,但我不能确定如何将我的其他文件组装到这个新的shaded jar,因为sha

  • 问题内容: 我正在使用Maven-Shade-Plugin创建可运行的Uber jar。根据本页上的最后一帧,可以使用以下方法将罐子的大小最小化: 但是,此功能未考虑log4j.properties文件中声明的类。因此,例如,即使在log4j.properties文件中声明了它,也不包含在Uber- jar中。 我相信我将在Spring面临同样的问题。如果我的代码仅引用接口A,并且我的Spring

  • 有谁知道如何使用Gradle制作一个uber/fat/shade sources-jar(和javadoc-jar)? 生成的 Jar 不仅应包含当前项目的源代码,还应包含其依赖项的源代码。我一直在研究,除其他外,一种香草方式和使用Shadow插件的方式。两者都擅长创建一个普通的uber/fat/shade jar,但它们似乎都不支持创建sources-jar的方法。