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

文章讲述了作者在项目中遇到ApachePOI包版本冲突导致的NoClassDefFoundError问题,通过`mvndependency:tree`发现不同版本的包冲突,解决方法是删除不适用的旧版本依赖,使用未被废弃的方法。经验教训包括注意包冲突和避免使用已Deprecate的代码。
摘要由CSDN通过智能技术生成

简而言之,因为参考别的项目处理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的问题定位以及解决

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

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


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

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!对于出现 NoClassDefFoundError 的问题,一般是由于编译时缺少了某个类的依赖导致的。以下是一些可能的解决方案: 1. 检查依赖:请确保您的项目中的依赖项已正确配置并且完整。可以通过查看您的 Gradle 构建文件(如 build.gradle)来确认是否已添加了所需的依赖项。如果缺少某个依赖项,可以尝试手动添加它。 2. 清理和重新构建:有时编译过程中出现问题会导致构建结果不完整。您可以尝试运行 `gradle clean` 命令清理构建结果,然后重新运行 `gradle build` 来重新构建项目。 3. 检查类路径:请确保您的项目的类路径正确设置,以含所有必要的类和依赖项。您可以查看您的构建脚本或 IDE 设置,确认类路径是否正确配置。 4. 检查打配置:如果您使用的是自定义的打配置,例如通过 Gradle 的插件或自定义任务进行打,可能需要检查是否正确地含了所有必要的类和资源文件。 5. 检查 Jar 结构:如果您的 Jar 结构不正确,可能会导致 NoClassDefFoundError。请确保您的 Jar 含了所有必要的类和资源文件,并且它们位于正确的位置。 6. 检查版本冲突:有时候不同的依赖项可能会引起版本冲突导致某些类无法找到。您可以尝试通过更新或排除依赖项来解决版本冲突问题。 希望以上解决方案能够帮助您解决问题。如果问题仍然存在,请提供更多的详细信息,以便我们提供更准确的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值