Apache POI 依赖版本冲突导致 NoSuchFieldError: Factory 报错

bash 复制代码
> 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.25.3.0 的 POI 版本

你打印的依赖树显示:

来自手动添加的依赖(或较新服务模块):

text 复制代码
org.apache.poi:poi-excelant:jar:5.3.0

来自 microservice-api 的传递依赖:

text 复制代码
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.2XSSFWorkbook.class,因此报如下错:

text 复制代码
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 依赖

xml 复制代码
<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 统一版本(推荐)

xml 复制代码
<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>

然后只在你项目中声明依赖即可,不必重复指定版本。


最后一步:执行清理与重编译

bash 复制代码
# 清除旧缓存
rm -rf ~/.m2/repository/org/apache/poi

# 然后重新构建
mvn clean install

总结

结论
错误原因 poi:5.3.0poi:4.1.2 冲突,导致 XSSFWorkbook 类结构不一致
根源 microservice-api 引入了旧版本 POI
解决方案 <dependency> 中排除旧版本,或通过 <dependencyManagement> 强制版本统一
必须操作 mvn clean install 清理旧缓存,确保生效
相关推荐
liuchangng2 小时前
Jev 模型研究:从生成式大模型到决策式模型——System One、RLCD 校准与采用边界
java·javascript·人工智能·python·深度学习
GPU实战笔记2 小时前
本地跑不动 llama.cpp,临时租云 GPU 怎么搭?从启动服务到环境复用
java·服务器·网络·人工智能·深度学习·llama
撸串-研究生2 小时前
SSM + Vue 线上作业批改系统:在线答题、文件提交与教师批改闭环90608
java·ssm·在线答题·作业批改·文件提交
一 乐2 小时前
养老院管理系统|基于springboot + vue养老院管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
wang_shu_mo_ran2 小时前
Spring MVC 常用注解和用法(二)——url,cookie,session
java·mvc
杨运交2 小时前
[074][示例]基于Redisson的分布式锁在定时任务中的实践与异常模拟
java·后端·spring
小刘在重生~2 小时前
Java Lock 显式锁案例|ReentrantLock 解决多线程安全问题(超详细实战)
java·笔记·面试
步行cgn2 小时前
Spring 中完整的 Scope 选项详解
java·后端·spring
hai_android3 小时前
Android MeasureSpec 详解
android·java·kotlin
阳光宅男@李光熠4 小时前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库