经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
SpringBoot解决jar包冲突的问题,简单有效
来源:jb51  时间:2021/9/27 20:52:24  对本文有异议

SpringBoot解决jar包冲突

今天SpringBoot项目打包发现一直在报错

包jar包冲突,找了好久才找到结果,期间遇到一片博客很讨人厌,我这里想评论一下他(原因:我没有博客园不能直接评论,所以这里写一篇博客记录一下,并提供正确的解决方案)

上图:

在这里插入图片描述 在这里插入图片描述

说一下:首先,你给的方法很泛(不是烦没打错字)只是市面上大多数可以解决的套路,

再者,你给的解决方案并没有真正的解决问题。所以我留下一句话:不喜勿喷。

SpringBoot事实上是很好的,jar包冲突的时候,它是有提醒你了的,启动第一行就说了有多个类路径jar包存在:Class path contains multiple SLF4J bindings.

SpringBoot适合于小团队及个人开发。是比较方便的。

为什么我要写这篇博客呢,因为我看到jar冲突的真正原因后,很生气,因为原因并不一定在SpringBoot 我这里查出的是腾讯云的cos-api也引入的了日志jar,所以导致冲突,这里是SpringBoot引入cos-api,你就说SpringBoot,如果SpringBoot是被被人引入的,你是不是也要说其他的工具不好呢???再者不好你为什么要用,要记录???这只不过是想比较而言,技术没有老旧,没有好坏,只有喜欢,不喜欢,很多时候有些公司用的还是一二十年前的技术,可能是有些原因不能更换,但是我相信,它能存在在这个世上并风靡一时,说明它一定有它的独特之处。

接下来就是,

我查到的一个解决方案,可使用所有jar包冲突问题

以eclipse为例:

这样的开发工具都会有一个功能:就是查询jar包直接引入/jar包间接引入的功能

在这里插入图片描述

如果你不知道你使用的工具怎么找到这个查找页面:百度搜索:eclipse 看引入jar 包的联系(idea同理)

说实话idea的更清晰一些,它是图形化界面

找到冲突的jar包,去除冲突的包即可

代码如下:

  1. <dependency>
  2. <groupId>com.qcloud</groupId>
  3. <artifactId>cos_api</artifactId>
  4. <version>5.5.3</version>
  5. <exclusions>
  6. <!-- <exclusion>
  7. <groupId>ch.qos.logback</groupId>
  8. <artifactId>logback-classic</artifactId>
  9. </exclusion> -->
  10. <exclusion>
  11. <groupId>org.slf4j</groupId>
  12. <artifactId>slf4j-log4j12</artifactId>
  13. </exclusion>
  14. </exclusions>
  15. </dependency>

声明:我只是对SpirngBoot报不平,没有对任何人做人身攻击。不喜勿喷

spring boot jar冲突问题集锦

总结下spring boot项目搭建过程中,冲突解决的一些小经验

1、日志jar包冲突

1.1、日志主要是spring boot自带spring-boot-starter-logging的排除

一是要用log4j2,二是xdcs不排除这个也会有冲突。(隐秘程度:低;重要程度:高)

  1. <exclusion>
  2. <artifactId>spring-boot-starter-logging</artifactId>
  3. <groupId>org.springframework.boot</groupId>
  4. </exclusion>

1.2、引的日志jar颇多

可能会有别的jar里也带了冲突的class,但是不影响启动,属于可排可不排。可能会导致测试环境起不来。(隐秘程度:低;重要程度:高)

  1. //这是举个例子
  2. <exclusion>
  3. <artifactId>slf4j-log4j12</artifactId>
  4. <groupId>org.slf4j</groupId>
  5. </exclusion>
  6. SLF4J: Class path contains multiple SLF4J bindings.
  7. SLF4J: Found binding in [jar:file:/Users/xmly/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.11.2/log4j-slf4j-impl-2.11.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
  8. SLF4J: Found binding in [jar:file:/Users/xmly/.m2/repository/org/slf4j/slf4j-log4j12/1.7.5/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
  9. SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
  10. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
  11. //这是启动时对应的报错,经检验,这个不影响启动

2、本地ok,测试环境失败之mainstay

发测试时,出现过mainstay的yml解析失败的问题,maven helper排jar包并未显示有冲突,tree搜索mainstay,发现了一些猫腻。passport-sso-api(0.0.14-M3,下面用到的也是这个版本)这个jar包里包含了这个mainstay的jar,最终导致了解析失败。后续登录验证可以接下网关鉴权等方式,这个jar冲突应该就不会出现了。(隐秘程度:高;重要程度:中)

  1. <exclusion>
  2. <artifactId>mainstay-rpc-thrift</artifactId>
  3. <groupId>com.ximalaya.mainstay</groupId>
  4. </exclusion>

3、本地ok,测试环境失败之servlet

发测试时,出现过servlet2和spring boot内置tomcat class重名冲突的问题,一般主要passport-sso-api和xdcs默认会带这个,排掉即可(隐秘程度:中;重要程度:高)

  1. <exclusion>
  2. <artifactId>servlet-api</artifactId>
  3. <groupId>javax.servlet</groupId>
  4. </exclusion>

4、本地ok,测试环境失败之tomcat

发测试时,也出现过passport-sso-api这个jar包里包含的spring-instrument-tomcat和spring boot内置tomcat冲突,排掉即可。后续登录验证可以接下网关鉴权等方式,这个jar冲突应该就不会出现了。(隐秘程度:高;重要程度:中)

  1. <exclusion>
  2. <artifactId>spring-instrument-tomcat</artifactId>
  3. <groupId>org.springframework</groupId>
  4. </exclusion>

5、本地ok,测试环境失败之spring asm

测试环境出现过passport-sso-api里spring asm与spring-boot-test-start冲突的情况,排掉排掉。passport-sso-api这个jar包含的jar比较多,后面建议用注解或者网关鉴权来做登录控制。(隐秘程度:高;重要程度:中)

  1. <exclusion>
  2. <artifactId>spring-asm</artifactId>
  3. <groupId>org.springframework</groupId>
  4. </exclusion>

6、万恶的测试环境字节码验证失败

之前发过一个前项目改造的spring boot项目就出现过,当时不以为意,让jvm参数加了-noverify就没管,后来发现很多项目都有这个问题,开始排查。之前看过jdk和aspectj有冲突的例子,就开始tree里搜aspectj,发现spring-boot-start-aop里引入了1.9.4版本的aspectjweaver,但是当时因为maven helper提示它冲突,就把它排了,后重新排掉所有1.7版本的aspectj,引入1.9.4版本的,解决。(隐秘程度:高;重要程度:高)

  1. <dependency>
  2. <groupId>org.aspectj</groupId>
  3. <artifactId>aspectjrt</artifactId>
  4. <version>${aspectj.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.aspectj</groupId>
  8. <artifactId>aspectjtools</artifactId>
  9. <version>${aspectj.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.aspectj</groupId>
  13. <artifactId>aspectjweaver</artifactId>
  14. <version>${aspectj.version}</version>
  15. </dependency>
  16. <exclusion>
  17. <artifactId>*</artifactId>
  18. <groupId>org.aspectj</groupId>
  19. </exclusion>

7、日志不能正常输出问题

排除,日志桥接混乱,后台配置的日志格式不支持了

  1. <exclusion>
  2. <artifactId>slf4j-log4j12</artifactId>
  3. <groupId>org.slf4j</groupId>
  4. </exclusion>
  1. Configuration:
  2. status: info
  3. Properties:
  4. Property:
  5. - name: log.level.console
  6. value: info
  7. - name: log.path
  8. value: /var/XXX/weXXX
  9. - name: project.name
  10. value: weXXX
  11. - name: log.pattern
  12. value: "%-d{yyyy-MM-dd HH:mm:ss SS} [%c]-[%p] %m%n"
  13. Appenders:
  14. Console:
  15. name: CONSOLE
  16. target: SYSTEM_OUT
  17. PatternLayout:
  18. pattern: ${log.pattern}
  19. RollingRandomAccessFile:
  20. - name: APP_FILE
  21. fileName: ${log.path}/${project.name}.log
  22. filePattern: "${log.path}/${project.name}-%d{yyyy-MM-dd}.log"
  23. PatternLayout:
  24. pattern: ${log.pattern}
  25. Filters:
  26. ThresholdFilter:
  27. - level: info
  28. onMatch: ACCEPT
  29. onMismatch: DENY
  30. Policies:
  31. TimeBasedTriggeringPolicy:
  32. modulate: true
  33. interval: 1
  34. DefaultRolloverStrategy:
  35. max: 30
  36. Loggers:
  37. Root:
  38. level: info
  39. AppenderRef:
  40. - ref: CONSOLE
  41. - ref: APP_FILE
  42. Logger:
  43. - name: app
  44. level: info
  45. additivity: false
  46. AppenderRef:
  47. - ref: CONSOLE
  48. - ref: APP_FILE

8、本地打包正常

测试或者线上环境打包失败,查看wrap.log日志,本地配置文件使用线上,打包测试;

spring-boot-maven-plugin插件放在靠后位置,不然打包失败;

  1. <profile>
  2. <id>uat</id>
  3. <properties>
  4. <profileActive>UatXXX</profileActive>
  5. </properties>
  6. <build>
  7. <plugins>
  8. <plugin>
  9. <groupId>org.codehaus.mojo</groupId>
  10. <artifactId>appassembler-maven-plugin</artifactId>
  11. <version>2.0.0</version>
  12. <configuration>
  13. <configurationDirectory>conf</configurationDirectory>
  14. <repositoryLayout>flat</repositoryLayout>
  15. <useWildcardClassPath>true</useWildcardClassPath>
  16. <daemons>
  17. <daemon>
  18. <id>${project.artifactId}</id>
  19. <mainClass>com.XXXX.Application</mainClass>
  20. <commandLineArguments>
  21. <commandLineArgument>--spring.profiles.active=${profileActive}
  22. </commandLineArgument>
  23. </commandLineArguments>
  24. <platforms>
  25. <platform>jsw</platform>
  26. </platforms>
  27. <jvmSettings>
  28. <!-- 启动内存配置 -->
  29. <initialMemorySize>2048M</initialMemorySize>
  30. <maxMemorySize>2048M</maxMemorySize>
  31. <maxStackSize>128</maxStackSize>
  32. <systemProperties>
  33. <systemProperty>application.root=.</systemProperty>
  34. <systemProperty>spring.application.name=${project.artifactId}
  35. </systemProperty>
  36. <systemProperty>spring.config.location=./conf/${profileActive}/
  37. </systemProperty>
  38. </systemProperties>
  39. <extraArguments>
  40. <extraArgument>-XX:MetaspaceSize=256M</extraArgument>
  41. <extraArgument>-XX:MaxMetaspaceSize=256M</extraArgument>
  42. <extraArgument>-XX:+UseG1GC</extraArgument>
  43. <extraArgument>-XX:-OmitStackTraceInFastThrow</extraArgument>
  44. <extraArgument>-XX:MaxGCPauseMillis=100</extraArgument>
  45. <extraArgument>-XX:+ParallelRefProcEnabled</extraArgument>
  46. <extraArgument>-XX:+HeapDumpOnOutOfMemoryError</extraArgument>
  47. <extraArgument>-XX:+PrintCommandLineFlags</extraArgument>
  48. <extraArgument>-XX:+PrintGCDetails</extraArgument>
  49. <extraArgument>-XX:+PrintGCDateStamps</extraArgument>
  50. <extraArgument>-verbose:class</extraArgument>
  51. <extraArgument>-XX:+PrintClassHistogramBeforeFullGC</extraArgument>
  52. <extraArgument>-XX:+PrintClassHistogramAfterFullGC</extraArgument>
  53. <extraArgument>-XX:+PrintTenuringDistribution</extraArgument>
  54. <extraArgument>-XX:+PrintHeapAtGC</extraArgument>
  55. <extraArgument>-XX:+PrintGCApplicationStoppedTime</extraArgument>
  56. <extraArgument>-XX:+PrintGCApplicationConcurrentTime</extraArgument>
  57. <extraArgument>-Xloggc:/var/log/${project.artifactId}/gc-%t</extraArgument>
  58. <extraArgument>-XX:+UseGCLogFileRotation</extraArgument>
  59. <extraArgument>-XX:GCLogFileSize=10M</extraArgument>
  60. <extraArgument>-XX:NumberOfGCLogFiles=10</extraArgument>
  61. <extraArgument>-javaagent:/opt/jars/aspectjweaver-1.8.9.jar</extraArgument>
  62. </extraArguments>
  63. </jvmSettings>
  64. <generatorConfigurations>
  65. <generatorConfiguration>
  66. <generator>jsw</generator>
  67. <includes>
  68. <include>linux-x86-64</include>
  69. <include>macosx-universal-64</include>
  70. </includes>
  71. <configuration>
  72. <property>
  73. <name>configuration.directory.in.classpath.first</name>
  74. <value>conf</value>
  75. </property>
  76. <property>
  77. <name>wrapper.ping.timeout</name>
  78. <value>60</value>
  79. </property>
  80. <property>
  81. <name>set.default.REPO_DIR</name>
  82. <value>lib</value>
  83. </property>
  84. <property>
  85. <name>wrapper.logfile</name>
  86. <value>/var/XXXX/${project.artifactId}/wrapper.YYYYMMDD.log</value>
  87. </property>
  88. <property>
  89. <name>wrapper.logfile.rollmode</name>
  90. <value>DATE</value>
  91. </property>
  92. <property>
  93. <name>wrapper.logfile.maxfiles</name>
  94. <value>10</value>
  95. </property>
  96. <property>
  97. <name>wrapper.pidfile</name>
  98. <value>/var/XXXX//${project.artifactId}</value>
  99. </property>
  100. <property>
  101. <name>wrapper.java.command</name>
  102. <value>/usr/local/jdk8/bin/java</value>
  103. </property>
  104. <property>
  105. <name>wrapper.disable_restarts</name>
  106. <value>TRUE</value>
  107. </property>
  108. <property>
  109. <name>wrapper.jvm_exit.timeout</name>
  110. <value>5</value>
  111. </property>
  112. <property>
  113. <name>wrapper.shutdown.timeout</name>
  114. <value>5</value>
  115. </property>
  116. <property>
  117. <name>wrapper.cpu.timeout</name>
  118. <value>0</value>
  119. </property>
  120. </configuration>
  121. </generatorConfiguration>
  122. </generatorConfigurations>
  123. </daemon>
  124. </daemons>
  125. </configuration>
  126. <executions>
  127. <execution>
  128. <id>generate-jsw</id>
  129. <phase>package</phase>
  130. <goals>
  131. <goal>generate-daemons</goal>
  132. </goals>
  133. </execution>
  134. </executions>
  135. </plugin>
  136. <plugin>
  137. <groupId>org.apache.maven.plugins</groupId>
  138. <artifactId>maven-assembly-plugin</artifactId>
  139. <configuration>
  140. <descriptors>
  141. <descriptor>src/main/assembly/assembly.xml</descriptor>
  142. </descriptors>
  143. </configuration>
  144. <executions>
  145. <execution>
  146. <id>make-assembly</id>
  147. <phase>package</phase>
  148. <goals>
  149. <goal>single</goal>
  150. </goals>
  151. </execution>
  152. </executions>
  153. </plugin>
  154. <plugin>
  155. <groupId>org.springframework.boot</groupId>
  156. <artifactId>spring-boot-maven-plugin</artifactId>
  157. <version>${spring.boot.version}</version>
  158. <executions>
  159. <execution>
  160. <goals>
  161. <goal>build-info</goal>
  162. </goals>
  163. <configuration>
  164. <additionalProperties>
  165. <encoding.source>UTF-8</encoding.source>
  166. <encoding.reporting>UTF-8</encoding.reporting>
  167. <java.source>${java.version}</java.source>
  168. <java.target>${java.version}</java.target>
  169. </additionalProperties>
  170. </configuration>
  171. </execution>
  172. </executions>
  173. </plugin>
  174. </plugins>
  175. </build>
  176. </profile>

tips:

1、不要太相信maven helper提示的jar冲突,具体还是要具体分析

2、有些jar冲突网上容易查到,有些基本查不到,可以先去tree搜个短名看看,看看有没有相似的jar,再去查是否真的会有冲突

3、有些是class冲突,找到对应的jar排掉即可,尽量别排spring自带的,容易出现兼容性问题

4、启动时,我已经将一些不必须的autoConfigure排掉了,真要用到,记得放出来,平时用不到的尽量排掉,这样就不会去加载了,不然很多都是默认加载的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号