升级org.apache.poi-poi-ooxml至5.2.4后遇java.lang.NoSuchMethodError求助
问题背景
将org.apache.poi:poi-ooxml从5.2.3升级到5.2.4后,运行时抛出java.lang.NoSuchMethodError异常,报错信息如下:
[ERROR] ErrorPageFilter - Forwarding to error page from request [/reports/myapp/myreport] due to exception ['org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream$Builder org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream.builder()']
java.lang.NoSuchMethodError: 'org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream$Builder org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream.builder()'
at org.apache.poi.xssf.usermodel.XSSFWorkbook.newPackage(XSSFWorkbook.java:521) ~[poi-ooxml-5.2.4.jar:5.2.4]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:231) ~[poi-ooxml-5.2.4.jar:5.2.4]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:227) ~[poi-ooxml-5.2.4.jar:5.2.4]
at org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:215) ~[poi-ooxml-5.2.4.jar:5.2.4]
at myapp.reports.service.impl.MyReportsExcelExporter.(MyReportsExcelExporter.java:37) ~[classes/:0.0.1-SNAPSHOT]
触发异常的代码:
import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class MyReportsExcelExporter { protected XSSFWorkbook workbook; ... public MyReportsExcelExporter() { this.workbook = new XSSFWorkbook(); // 初始化Workbook时触发异常 } ... }
原因
这是依赖版本不兼容导致的:
- POI 5.2.4版本对
commons-io的依赖版本要求提升到了2.11.0及以上,该版本新增了UnsynchronizedByteArrayOutputStream.builder()方法。 - 项目中当前使用的
commons-io版本低于2.11.0,导致POI调用该方法时找不到对应的实现,抛出NoSuchMethodError。
解决方案
- 升级
commons-io版本:在项目的依赖管理文件中,明确指定commons-io版本为2.11.0或更高(POI 5.2.4官方依赖版本为2.11.0)。- Maven示例:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> - Gradle示例:
implementation 'commons-io:commons-io:2.11.0'
- Maven示例:
- 排查依赖冲突:使用依赖分析工具(如Maven的
mvn dependency:tree或Gradle的./gradlew dependencies)检查项目中是否有其他依赖引入了旧版本的commons-io,排除低版本的传递依赖。
内容的提问来源于stack exchange,提问作者Prem

