一、问题排查和解决
- 如果有异常堆栈信息,根据错误信息即可定位导致冲突的类名,然后在eclipse中
CTRL+SHIFT+T
或者在idea中CTRL+N
就可发现该类存在于多个依赖Jar包中 - 若步骤1无法定位冲突的类来自哪个Jar包,可在应用程序启动时加上JVM参数
-verbose:class
或者-XX:+TraceClassLoading
,日志里会打印出每个类的加载信息,如来自哪个Jar包 - 定位了冲突类的Jar包之后,通过
mvn dependency:tree -Dverbose -Dincludes=<groupId>:<artifactId>
查看是哪些地方引入的Jar包的这个版本 - 确定Jar包来源之后,如果是第一类Jar包冲突,则可用<excludes>排除不需要的Jar包版本或者在依赖管理<dependencyManagement>中申明版本;若是第二类Jar包冲突,如果可排除,则用<excludes>排掉不需要的那个Jar包,若不能排,则需考虑Jar包的升级或换个别的Jar包。当然,除了这些方法,还可以从类加载器的角度来解决该问题,可参考博文——如果jar包冲突不可避免,如何实现jar包隔离,其思路值得借鉴。