文章目录
- 场景
- 解决方案
- 整理基础信息
- 处理阶段
- 其他
- .m2最好也看下
- 相关类信息等(主要是为了便于复制)
场景
有个线上问题需要紧急处理,改两行代码,偏偏在这时,项目启动报错了,你说急不急。
报错信息:java.lang.NoClassDefFoundError: net/sf/jsqlparser/statement/select/SelectBody
解决方案
这种报错一般是jar包不对,有两种可能:
1、类确实找不到。
2、这是一个接口,但是没有实现类(重 这种情况的可能性更大)。
而本地包并没有动过,所以很有可能是公司标准包的依赖更新了。
整理基础信息
我们一点一点的理关系。
1、idea中双击shift找到这个类,记下包信息。com.github.jsqlparser:jsqlparser
版本1.0
2、idea导出uml文本(UML,全称为Unified Model Language,即统一建模语言,个人认为在maven里这么翻译也适用),导出方法见【maven通过idea找依赖关系】文章。
3、在uml里面搜索 com.github.jsqlparser:jsqlparser
,发现了两个信息。
(1) uml中 com.github.jsqlparser:jsqlparser
版本居然是4.7
(2) jsqlparser
的上级依赖是com.github.pagehelper:pagehelper:jar:6.1.0
由于jsqlparser
并没有其他上级依赖,所以pagehelper
是它的唯一依赖,只用处理pagehelper
就行。
4、在uml里面搜索 com.github.pagehelper:pagehelper
,找到所有上级依赖,例如这里有两个上级依赖。com.ttt.dlh:user-common
com.ttt.dlh.org-common
处理阶段
5、 到这里停一下。我们分析下问题的原因。
idea中的jsqlparser
是1.0
版本,点SelectBody
发现这是个接口,继续点,发现有实现类,说明1.0版本是对的。如果点不开实现类,说明idea中看到的版本是错的。
也就是说,jsqlparser
的1.0
版本是对的,4.7
版本是错的。
而它是由pagehelper
带出来的,所以uml中的pageHelper 6.1.0
版本是错的,pom中排除掉。
6、排除掉错误依赖。
涉及到的上级都排除掉,有几个排除几个。
<exclusions>
<exclusion>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</exclusion>
</exclusions>
7、重新引入正确依赖。
然后还没完,因为现在pom中pageHelper
被排除掉了,原版本肯定有这个依赖,需要确认下版本号。找到之前的jar包,解压,然后到lib目录找pageHelper
,就能得到版本号,发现版本是5.1.2
,在pom中添加此依赖。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
然后更新项目,clean,install,再启动试下,发现可以了。
事后总结好像看起来很简单,实际费了好大劲,这腾了半天。。。
其他
.m2最好也看下
.m2
仓库也清理下,因为用的仓库不是它,有.m2
容易引起不可预知的问题。
相关类信息等(主要是为了便于复制)
net.sf.jsqlparser.statement.select.SelectBody
类com.github.jsqlparser:jsqlparser
包com.github.pagehelper:pagehelper
包