apache.poi使用时出现java.lang.NoSuchMethodError相关问题解决

本文探讨了在使用Apache POI解析Word文档时遇到的NoSuchMethodError,源于子项目继承自父项目中过低的POI版本。通过分析Maven DependencyManagement的工作原理,揭示了问题产生的原因并提供了修改父POM解决冲突的方法。

问题

调用poi进行word的XWPFTemplate进行解析时出现错误

Caused by: java.lang.NoSuchMethodError: org.apache.poi.xwpf.usermodel.XWPFDocument.getDocComments()Lorg/apache/poi/xwpf/usermodel/XWPFComments;

问题排查

根据报错信息,可以看到是XWPFDocument类中缺失getDocComments方法导致的,所以双击搜索XWPFDocument类可以直接查找进入该类

这里我搜索出问题的类只搜索出了一个类,看网上其他博客发现如果同一个依赖导入多次也会出现同样的该问题,可以删除重复依赖导入即可,这里不多赘述

进入类之后点击左侧project的这个按钮即可跳转该类所在的依赖包

通过依赖包可以看到依赖版本,我这里看到的poi版本为4.1.2,而进入该工程pom文件引用到poi的依赖(我这里是poi-tl)可以看到需要版本为(5.2.2),由此可以得出依赖版本出错导致导包版本过低,最终出现的报错

问题出现原因

该项目是父工程下的一个子项目,这里科普一下Maven中的DependencyManagement:

Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式。 通常会在一个组织或者项目的最顶层的父POM
中看dependencyManagement 元素。 使用pom.xml 中的dependencyManagement
元素能让所有在子项目中引用一个依赖而不用显式的列出版本号。 Maven
会沿着父子层次向上走,直到找到一个拥有dependencyManagement 元素的项目,然后它就会使用这个
这样做的好处:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改;另外如果某个子项目需要另外的一个版本,只需要声明version就可。
总结:

  • dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
  • 如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom。

所以由于父工程中指定了poi版本,导致子工程依赖的版本失效

解决方法

修改父工程pom文件中的poi版本即可
这一过程又出现了子项目不会跟着父项目pom文件的更新而更新依赖的问题,详情可见我的另一篇博客

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值