关于java.lang.NoSuchFieldError报错解决方案

本文分享了一次Maven项目中因多个子项目使用相同包路径及类名导致的类冲突问题排查经历。通过实际案例解析如何定位问题所在,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题浮现(结论党请跳过这一节直接查看‘总结’):

今天项目遇到这个问题,搜集网上各路大神的解决方式,都是第三方jar包使用高版本之后便解决了问题,也有少数人说是因为同时出现高版本和低版本jar包出现的问题,比如:,又比如:

那么问题来了,我们使用的类名定义都是自定义的类,包路径也是公司名+部门名称+类名,比如:com.companyname.partname.BusinessError。这还存在冲突么?难道英雄所见略同,但世界太小了吧,都同到一个部门了。将类名修改一下便可以使用,难道类的加载器不能识别error后缀?(当时已经绝望之际开始脑洞大开)就在类名修改为BusinessErrorXXX后在修改回来BusinessError的时候,eclipse提示出现:

还真有一样的路径一样的类名,但可喜可贺的是,下方提示了你引入的哪个包已经占用了这个路径。由此问题源头找到,修改包路径或者类名即可。


总结一下:

该问题字面意思,没有找到相应的字段。原因在于,maven项目开发的时候,两个子项目同时进行开发,互不关联,有第三个子项目进行使用这两个字项目。就比如,一个带有支付软件项目,支付组自己进行支付相关工具封装,网站组也对自己实用工具封装,部门说,支付组做的子项目要能够灵活使用其他项目中,那么exception枚举类就要使用自己的,刚好他们使用了相同的包路径和类名,造成整体项目打包的时候类加载进行了覆盖,可能你是用的字段在另外一个包中就是没有,所以就造成了该问题。(计算机报这个错还真TNND没毛病,nia也没说错。)经过思考,之前相关的删除多余第三方jar包或者替换最新第三方包的情况,实质也是包路径和类名冲突造成的




<think>我们正在处理一个关于EasyExcel使用中出现的异常问题:java.lang.NoSuchFieldError:Factory。根据提供的引用信息,这个问题通常是由于jar包冲突引起的。具体来说,可能是由于项目中同时存在不同版本的poi-ooxml相关jar包,或者easyexcel与poi版本不兼容导致的。根据引用[2]和引用[3]的信息,我们可以知道:1.异常发生在org.apache.poi.xssf.model.ThemesTable.readFrom方法中,具体是在初始化ThemesTable时。2.问题定位过程发现有两个jar包都包含了ThemeDocument类:poi-ooxml-lite和poi-ooxml-schemas(来自easyexcel的依赖)。3.解决方案是删除其中一个依赖,比如删除easyexcel的依赖(但这样就不能使用easyexcel了)或者排除冲突的jar包。然而,引用[3]和引用[4]提供了另一种思路:可能是easyexcel和poi的版本冲突。引用[4]提到错误原因可能是依赖冲突,并给出了一个例子:同时使用了easyexcel-core3.3.3和poi4.1.2。因此,我们更倾向于通过排除冲突的依赖来解决,而不是直接删除整个easyexcel依赖。具体步骤:1.检查项目的依赖树,找到冲突的jar包(特别是poi-ooxml-schemas和poi-ooxml-lite)。2.排除easyexcel中传递的poi依赖,因为easyexcel内部已经集成了poi,如果项目中同时引入了poi,可能会导致版本不一致。以Maven项目为例,可以在引入easyexcel的依赖中排除poi相关依赖:```xml<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</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></exclusions></dependency>```然后,单独引入与easyexcel版本兼容的poi依赖。需要查看easyexcel官方文档或源码,确定其内部使用的poi版本,然后引入相同的版本。如果不想排除,也可以尝试统一所有poi相关依赖的版本。例如,如果easyexcel内部使用的是poi4.1.2,那么项目中也应该使用poi4.1.2。另外,引用[2]中提到,问题可能是由于poi-ooxml-schemas这个jar包和poi-ooxml-lite冲突。所以也可以尝试排除poi-ooxml-schemas:```xml<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</version><exclusions><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId></exclusion></exclusions></dependency>```但注意,排除依赖可能会导致功能缺失,因此需要测试。总结解决方案:1.检查依赖冲突,使用maven命令(如mvndependency:tree)查看依赖树,找到冲突的jar包。2.排除easyexcel中传递的poi依赖,然后单独引入与easyexcel兼容的poi版本。3.或者,统一项目中所有poi相关依赖的版本(包括poi,poi-ooxml,poi-ooxml-schemas等)为同一个版本,且该版本需要与easyexcel内部使用的版本一致。注意:不同版本的easyexcel依赖的poi版本可能不同,需要查阅对应版本的文档或源码。例如,根据引用[4],easyexcel-core3.3.3依赖的poi版本可能是4.1.2。因此,项目中应该使用poi4.1.2,而不是其他版本。如果以上方法不能解决,可以考虑升级easyexcel到最新版本,因为新版本可能已经解决了兼容性问题。最后,如果问题仍然存在,建议参考官方文档或社区寻求帮助。相关问题:1.如何查看Maven项目的依赖树?2.EasyExcel和ApachePOI的兼容版本对应关系是怎样的?3.如何解决Java中的NoSuchFieldError异常?4.除了排除依赖,还有哪些解决jar包冲突的方法?</think>### EasyExcel 中 `java.lang.NoSuchFieldError: Factory` 异常解决方案 该异常通常由 **POI 库的版本冲突**引起,特别是当项目中同时存在多个不同版本的 Apache POI 依赖时。以下是系统化的解决步骤: --- ### 一、问题原因分析 1. **根本原因** EasyExcel 内部依赖特定版本的 POI 库(如 `poi-ooxml`),当项目中存在其他版本的 POI 依赖时,会导致类加载器加载到不兼容的类文件,引发 `NoSuchFieldError`[^1][^2]。 2. **典型冲突场景** - 项目显式引入 POI 依赖(如 `poi 5.x`)与 EasyExcel 内置的 POI 版本(如 `poi 4.x`)冲突 - 多个子模块分别引入不同版本的 POI - 第三方库(如 `easyexcel-core`)传递依赖了冲突的 POI 组件[^2][^4] --- ### 二、解决方案 #### ✅ 方法 1:统一 POI 版本(推荐) 在 `pom.xml` 中显式指定 POI 版本,覆盖所有传递依赖: ```xml <properties> <!-- 选择与 EasyExcel 兼容的版本 --> <poi.version>4.1.2</poi.version> </properties> <dependencies> <!-- EasyExcel 依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.3</version> <!-- 排除其内部的 POI 依赖 --> <exclusions> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入统一版本的 POI --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${poi.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi.version}</version> </dependency> </dependencies> ``` > **关键点**:通过 `<exclusion>` 移除 EasyExcel 内部的 POI,再显式引入统一版本[^3][^4]。 #### ✅ 方法 2:依赖排除 仅排除冲突的子模块(无需显式引入 POI): ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.3</version> <exclusions> <!-- 排除冲突的 POI 子模块 --> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-lite</artifactId> </exclusion> </exclusions> </dependency> ``` #### ✅ 方法 3:检查依赖树 使用 Maven 命令定位冲突: ```bash mvn dependency:tree -Dincludes=org.apache.poi ``` 输出示例: ``` [INFO] org.apache.poi:poi:jar:5.2.0 (冲突) [INFO] \- com.alibaba:easyexcel:jar:3.3.3 [INFO] \- org.apache.poi:poi-ooxml:jar:4.1.2 (被覆盖) ``` > **处理原则**:保留版本号最高的依赖或显式排除低版本。 --- ### 三、版本兼容性参考 | EasyExcel 版本 | 兼容 POI 版本 | 冲突风险 | |----------------|---------------|----------| | 3.x | 4.1.2 | 低 | | 2.x | 3.17 | 中 | | 1.x | 3.15 | 高 | > 建议始终使用最新稳定版 EasyExcel(当前为 3.3.3)[^4]。 --- ### 四、验证步骤 1. 清理 Maven 本地仓库: ```bash mvn clean install -U ``` 2. 重启 IDE 并重建项目索引 3. 运行单元测试验证导出功能 > 若仍报错,检查是否有其他传递依赖引入 POI(如 `tika-parsers`、`pdfbox` 等),需同样进行排除[^2]。 --- ### 相关问题 1. EasyExcel 与 POI 的版本兼容性如何查看? 2. 除了 Maven,Gradle 项目中如何解决此类依赖冲突? 3. 为什么 `NoSuchFieldError` 通常在运行时才暴露? 4. 如何避免 Java 项目中常见的依赖冲突问题? [^1]: 引用自 POI 异常堆栈信息 [^2]: 引用自依赖冲突分析过程 [^3]: 引用自删除依赖的解决方案 [^4]: 引用自版本冲突示例
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值