今天springboot打包成jar后,利用java -jar xxx.jar启动的时候报下面错误:
    如何进行依赖冲突排查 - 图1

    1.错误提取

    错误来源于:Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12,所以可以看出是因为依赖冲突,导致StackOverflowError错误。

    2.错误分析

    现在又遇到一个很尴尬的问题,pom文件的依赖实在太多了,根部不知道从何下手。没办法所以只能先看一下整个依赖里面slf4j-log4j12是在哪里,查找了一遍果然找到相关的依赖,slf4j-log4j12如下图所示:

    如何进行依赖冲突排查 - 图2

    根据jar的pom文件可以看出,这个slf4j-log4j12依赖父级是org.slf4j,然后想着去我的pom文件中查找一下就可以了,然后就尴尬了,发现没有这个依赖。可是为什么没有这个依赖,会有jar加载到项目中去呢,分析一下基本可以断定,应该是其它依赖的子依赖有引用到org.slf4j这个依赖。

    3.问题排查

    那怎么看到底是哪一个依赖引用到了org.slf4j依赖呢,这边我们可以用idea的一个查看依赖的功能。

    如何进行依赖冲突排查 - 图3

    打开之后如下所示:
    如何进行依赖冲突排查 - 图4

    4.修复bug

    从这个图我们可以很明显的看出,是zookeeper依赖引用了slf4j-log4j12依赖,所以我们只要在zookeeper依赖中使用exclusion进行依赖接触可以了,具体pom代码如下所示:



    org.apache.zookeeper
    zookeeper
    3.4.5


    org.slf4j
    slf4j-log4j12



    然后重新启动就可以看下下面让你开心的打印信息了。

    如何进行依赖冲突排查 - 图5

    总结:

    这种问题在maven项目很常见,本质就是依赖问题,但是虽然问题很常见,可是解决的过程却特别繁琐。因为有时候你不知道哪里出问题,又不能用debug进行调试,所以我们只能借助仅存的错误提示来排查错误。这个时候我们更应该借助工具的作用,比如今天讲到的idea中查看依赖的工具。