文章目录

  • 场景
  • 解决方案
  • 整理基础信息
  • 处理阶段
  • 其他
  • .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-commoncom.ttt.dlh.org-common

处理阶段

5、 到这里停一下。我们分析下问题的原因。

idea中的jsqlparser1.0版本,点SelectBody发现这是个接口,继续点,发现有实现类,说明1.0版本是对的。如果点不开实现类,说明idea中看到的版本是错的

也就是说,jsqlparser1.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