问题
调用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文件的更新而更新依赖的问题,详情可见我的另一篇博客