这是一个排错的经验分享贴子。
最近在跟着知识星球做项目,到最后是部署到服务器,使用的方式是打包jar包上传到服务器运行。
但在实际打包的过程中,出现了本地IDEA可运行,jar包不可运行的错误。
具体错误截图如下:
可以发现,错误是ClassNotFoundException
。
于是我顺藤摸瓜找到了打包后的对应Jar包,找到我出错误的相关jar包,jackson相关的依赖,发现确实没有这个jar包。
很奇怪,于是我找到本地的IDEA,发现依旧没有这个类。
(IDEA运行时候的容错率比较高,有时候可以正常运行,但打包要绝对严谨,缺少类或者版本不一致绝对会报错的)
可是我的项目(父项目)设定了版本号2.15.2,按理来说这个版本是会有这个类的。
<!-- 版本号统一管理 --><properties>... ...<!--jackson工具,用于将出入参转化为json字符串--><jackson.version>2.15.2</jackson.version>... ...</properties><!-- 统一依赖管理 --><dependencyManagement><dependencies>... ...<!-- jackson工具,用于将出入参转化为json字符串 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson.version}</version></dependency>... ...</dependencies></dependencyManagement>
子模块之间的依赖也没有出问题,为何没有导入Jar包呢?
搜索了很多资料后,我怀疑是:版本冲突
在控制台执行代码如下:
mvn dependency:tree | Select-String -Pattern "jackson"
这句话的意思是找到所有jackson的jar包,通过这个命令,可以找到它的版本号,查看是否存在版本号不一致的问题。
控制台输出以下内容:
以上是部分内容截图,可以看到,jackson有的相关jar包版本号为2.15.2,有的则为2.13.1,出现了版本号冲突,并且低版本的2.13.1确实会相比于2.15.2版本缺少一些类。
那么为什么会出现这种情况,我已经定义了版本号,为何没有按照这个来呢?
排查了很久,我发现是springboot版本的问题。
父pom文件里,我将版本号设置为2.6.3
在导入Jar包的时候,会按照对应的版本导入,由于版本号太低,无法导入2.15.2版本的Jackson,而是按照对应版本导入了2.13.1版本
解决办法
在启动类里,将版本号更改为更高的2.6.6。
(注意:父项目的版本号和子模块版本号是可以不一致的)
<!-- Web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.6</version></dependency>
这次我终于成功导入了Jar包