记一次引入低版本包导致包冲突,表现为NoClassDefFoundError的故障

简而言之,因为参考别的项目处理excel的代码if(org.apache.poi.hssf.usermodel.HSSFDateUtil.isCellDateFormatted(cell)) ,为了使用这个HSSFDateUtil类我引入了依赖:

<dependency>
   <groupId>org.apache.poigroupId>
   <artifactId>poiartifactId>
   <version>4.1.2version>
 dependency>

本地IDE编译无问题,但是打包部署后,跑起来却报java.lang.NoClassDefFoundError。当时真是觉得很奇怪,明明引入的包能找到这个类,而且IDE也没有任何编译出错的标红代码:记一次引入低版本包导致包冲突,表现为NoClassDefFoundError的故障_第1张图片

根据经验和直觉,判断可能是包冲突问题。果然,使用mvn dependency:tree命令1,找到项目中有多个版本的org.apache.poi包,而项目实际使用的不是我新引入的4.1.2版本包,而是已有的5.2.3版本包。而在5.2.3版本包里,HSSFDateUtil类已经被移除了。这其实也在情理之中,因为在4.1.2包中的HSSFDateUtil类本来就被@Deprecated修饰。

破案了,如何解决问题呢?我看了下源码,HSSFDateUtil.isCellDateFormatted其实是直接继承自其父类DateUtil,而DateUtil类和它的isCellDateFormatted方法在5.2.3包中也还有,所以这里不想用旧版本包的话,删掉前面加上的4.1.2依赖,使用DateUtil类即可:

                  if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
 //                   if (org.apache.poi.hssf.usermodel.HSSFDateUtil.isCellDateFormatted(cell)) {

总结下经验教训:
1,小心包冲突导致的错误,这些错误经常IDE不会报错,也能找到相关的类或者方法,但是项目实际运行时不是用的你看到的代码-_-
2,避免使用标记为Deprecated的代码,一不小心改个版本,你依赖的代码没有了,然而你并不知道。。

参考文章:maven中类冲突,包依赖NoClassDefFoundError以及方法NoSuchMethodError的问题定位以及解决

解决maven依赖冲突,这篇就够了!

Jar包冲突问题及解决方案!


  1. 我:查看包是由哪个依赖引入的 ↩︎

你可能感兴趣的:(CICD,git,github,maven,maven,包冲突,NoClassDefFound)