> mvn dependency:tree -Dincludes=org.apache.poi
.....
[INFO] +- org.apache.poi:poi:jar:4.1.2:compile
[INFO] +- org.apache.poi:poi-ooxml:jar:4.1.2:compile
[INFO] +- org.apache.poi:poi-scratchpad:jar:4.1.2:compile
[INFO] +- org.apache.poi:poi-ooxml-schemas:jar:4.1.2:compile
[INFO] \- org.apache.poi:ooxml-schemas:jar:1.4:compile
[INFO]
当前项目的问题已经完全清晰了:Apache POI 依赖版本严重冲突,直接导致了 NoSuchFieldError: Factory
报错。
问题分析:同时引入了 4.1.2 和 5.3.0 的 POI 版本
你打印的依赖树显示:
来自手动添加的依赖(或较新服务模块):
org.apache.poi:poi-excelant:jar:5.3.0
来自 microservice-api
的传递依赖:
org.apache.poi:poi:jar:4.1.2
org.apache.poi:poi-ooxml:jar:4.1.2
org.apache.poi:poi-scratchpad:jar:4.1.2
org.apache.poi:poi-ooxml-schemas:jar:4.1.2
org.apache.poi:ooxml-schemas:jar:1.4
这会导致最终运行时 不同版本的类混用,例如你代码是基于 5.3.0
写的,但运行时加载的是 4.1.2
的 XSSFWorkbook.class
,因此报如下错:
Exception in thread "main" java.lang.NoSuchFieldError: Factory
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:508)
正确解决方案:排除旧版本,统一使用 POI 5.3.0
你应该在主项目的 pom.xml
中添加 <dependencyManagement>
或 <exclusions>
,强制统一为 5.3.0。
方法一:在 pom.xml
中显式排除旧版本 poi 依赖
<dependency>
<groupId>com.example.microservice.service</groupId>
<artifactId>microservice-api</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
</exclusion>
</exclusions>
</dependency>
方法二:用 dependencyManagement
统一版本(推荐)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>5.2.1</version>
</dependency>
</dependencies>
</dependencyManagement>
然后只在你项目中声明依赖即可,不必重复指定版本。
最后一步:执行清理与重编译
# 清除旧缓存
rm -rf ~/.m2/repository/org/apache/poi
# 然后重新构建
mvn clean install
总结
项 | 结论 |
---|---|
错误原因 | poi:5.3.0 与 poi:4.1.2 冲突,导致 XSSFWorkbook 类结构不一致 |
根源 | microservice-api 引入了旧版本 POI |
解决方案 | 在 <dependency> 中排除旧版本,或通过 <dependencyManagement> 强制版本统一 |
必须操作 | mvn clean install 清理旧缓存,确保生效 |