简而言之,因为参考别的项目处理excel的代码if(org.apache.poi.hssf.usermodel.HSSFDateUtil.isCellDateFormatted(cell))
,为了使用这个HSSFDateUtil类我引入了依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
本地IDE编译无问题,但是打包部署后,跑起来却报java.lang.NoClassDefFoundError。当时真是觉得很奇怪,明明引入的包能找到这个类,而且IDE也没有任何编译出错的标红代码:
根据经验和直觉,判断可能是包冲突问题。果然,使用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的问题定位以及解决
我:查看包是由哪个依赖引入的 ↩︎