问题描述
项目中用了公司的某一款框架A,里面集成了mybatis。新开发的项目使用了mybatis-plus,要引入A框架。配置好数据源、包扫描与bean扫描后,运行报
ClassNotFoundException: org.mybatis.logging.LoggerFactory
错误。
分析问题
百度了一下,遇到这个情况的人还真不少,教程都是说让移除mybatis-spring-boot-starter
,我检查过我的代码,使用的框架依赖了mybatis-spring-boot-starter
这个还真不少!还是一个费力活呢,我花了一个早上把pom.xml中的含有这个的框架都移除了,怀着期待的心态,每移除一个就跑起来测一下,直到最后一个移除了还不行,我心态裂开了。
百度上找不到我的解决方法之后,我开始看源码,看看在执行的过程中什么地方会用到这个LoggerFactory
。我从数据源配置开始看,刚开始看到MybatisSqlSessionFactoryBean
的时候,我就发现了,居然源码中真的没有LoggerFactory
!
我的Mybatis-Plus的版本是3.4.2,在项目中导入的方式是通过mybatisplus-spring-boot-starter
,这里面导入了mybatis-plus
与mybatis-plus-extension
,这两个框架里面又自己去依赖了mybatis-spring
的版本,那为什么会出现这个框架中找不到类的情况?不可能mybatis-plus开发人员会犯这种错误的吧。
解决过程
真相就只有一个:mybatis-plus-extension
中管理的mybatis-spring
版本被我项目中其它地方引入的mybatis-spring
版本给覆盖了。
我们来验证一下猜想:
通过点击前面的包名,找到所在的library文件,查看当前所依赖的mybatis-spring
的版本。如下图所示,目前依赖到的版本是1.3.2。
在来看看mybatis-plus-extension
中所需要的mybatis-spring
的版本是什么?是2.0.5版本。
那答案就很明显了,就是mybatis-plus
版本覆盖的原因。解决问题的方法很简单,但我更想直到这个1.3.2版本是怎么来的,于是我看了所引用的公司A框架的依赖。果然坑在这里。
问题解决
前面的分析已经清楚是mybatis-spring
的版本覆盖问题出现的类缺失导致的错误,我推测所有同学出现这个错误都是这个原因(不信可以自己看源码核查),如果是在自己的最外层引入了mybatisplus-spring-boot-starter
和mybatis-spring-boot-starter
,这个问题确实好解决,直接把mybatis-spring-boot-starter
的依赖移除就好;如果和我是一个情况,是引入了公司的框架或则其它第三方框架里集成的mybatis-spring
,根据我的白费经验,强行exclusions是不行的。在自己的pom文件中导入合适正确mybatis-spring
的版本再覆盖回来就好。
废话很多,但是干货满满,希望可以帮到屏幕前正为这个异常抓狂的你。