java.lang.NoSuchFieldError: count at org.eclipse.jface.viewers.ColumnViewer$1.mouseDown

本文介绍在使用SWT开发过程中遇到的TreeViewer点击报错问题及解决方案。通过更换不同版本的SWT库,最终解决了NoSuchFieldError错误。

学习swt开发,在开发treeviewer 按照例子编写代码过程中,一切都很顺利,一run,整颗树都出来了,但是点击图形界面任一地方,报错,如下:

Exception in thread "main" java.lang.NoSuchFieldError: count
	at org.eclipse.jface.viewers.ColumnViewer$1.mouseDown(ColumnViewer.java:88)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:133)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2968)
	at UsingTreeViewer.main(UsingTreeViewer.java:83)
	
</pre>百度谷歌都没答案,看报错明显是jar包问题,<p></p><p>先看了一下ColumnViewer 的源码,我用的是3.8.1版本</p><p></p><pre name="code" class="java">import org.eclipse.swt.events.MouseEvent;
</pre><pre name="code" class="java">if (viewerEditor != null) {
			control.addMouseListener(new MouseAdapter() {
				public void mouseDown(MouseEvent e) {
					// Workaround for bug 185817
					if (e.count != 2) {
						handleMouseDown(e);
					}
				}

MouseEvent 为swt.jar 的类,版本为3.1 查看源码,并没有count的属性 后来谷歌了一下 count 为3.3版本后才有的属性,于是换了3.4版本的swt.jar 便可以了,资源在我上传文件里面有








<think>我们正在解决使用EasyExcel时出现的`com.alibaba.excel.exception.ExcelGenerateException:java.lang.NoSuchFieldError:Factory`异常。根据之前的分析,这通常是由于POI版本冲突引起的。用户引用中提到了一种方法:删除EasyExcel依赖,但这显然不是我们想要的,因为我们需要使用EasyExcel。因此,我们需要在不删除EasyExcel的前提下解决冲突。以下是详细步骤:###解决方案步骤####1.确定冲突的依赖首先,我们需要检查项目中是否存在多个版本的POI库。可以通过Maven依赖树来分析:在终端中运行:```bashmvndependency:tree-Dincludes=org.apache.poi```或者在Gradle项目中:```bashgradledependencies--configurationruntimeClasspath|greppoi```####2.统一POI版本(推荐)EasyExcel3.x通常需要POI5.2.x版本。因此,我们可以在项目的pom.xml(Maven)或build.gradle(Gradle)中显式指定POI依赖的版本。**Maven示例:**```xml<properties><!--使用与EasyExcel兼容的POI版本--><poi.version>5.2.5</poi.version></properties><dependencies><!--EasyExcel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.4</version><!--排除EasyExcel内部自带的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><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>${poi.version}</version></dependency></dependencies>```**Gradle示例:**```groovy//定义POI版本ext.poiVersion='5.2.5'dependencies{//EasyExcel排除POI依赖并引入指定版本implementation('com.alibaba:easyexcel:3.3.4'){excludegroup:'org.apache.poi'}implementation"org.apache.poi:poi:${poiVersion}"implementation"org.apache.poi:poi-ooxml:${poiVersion}"implementation"org.apache.poi:poi-ooxml-schemas:${poiVersion}"}```####3.清理并重新构建项目执行清理和重新构建命令,确保依赖更新生效:-Maven:`mvncleaninstall-U`-Gradle:`gradlecleanbuild--refresh-dependencies`####4.验证问题是否解决运行导出Excel的代码,检查异常是否消失。###原理说明该异常是因为在运行时加载了不兼容的POI类版本。EasyExcel内部依赖POI,但如果项目中存在另一个低版本的POI(例如4.1.2),则可能导致`Factory`类(在POI5.x中进行了重构)找不到特定字段。通过统一版本并排除EasyExcel内部的POI,我们确保使用兼容的版本。###补充说明如果以上方法仍然无法解决问题,请检查是否还有其他依赖引入了旧版POI。例如,某些模块可能传递依赖了旧版POI。在这种情况下,需要继续排除这些模块中的POI依赖。###相关问题1.如何查看Maven依赖树的具体结构?2.排除依赖时使用通配符`*`是否安全?3.EasyExcel与POI版本的兼容性列表在哪里可以找到?4.使用SpringBoot时如何管理POI版本?[^1]:删除依赖是临时解决方案,但会丧失EasyExcel功能</think>### 解决 EasyExcel 导出报错:`com.alibaba.excel.exception.ExcelGenerateException: java.lang.NoSuchFieldError: Factory` 此错误是由于 **POI 依赖版本冲突**导致,根本原因是项目中存在多个不兼容的 POI 库版本。以下是完整解决方案: --- ### 错误原因分析 1. **POI 版本不匹配** EasyExcel 依赖特定版本的 POI(Apache POI),当项目中存在多个 POI 版本时,会触发 `Factory` 类加载冲突[^1]。 2. **依赖传递冲突** 其他组件(如公共服务模块)可能引入低版本 POI(如 3.x),而 EasyExcel 3.3+ 需要 POI 5.2+,导致 `Factory` 类结构不兼容[^2]。 --- ### 解决方案(不删除 EasyExcel) #### ✅ 最佳方案:统一 POI 版本 在 `pom.xml` 中强制指定 POI 版本(兼容 EasyExcel 3.3+): ```xml <properties> <!-- 使用兼容版本 --> <poi.version>5.2.5</poi.version> </properties> <dependencies> <!-- EasyExcel 依赖(排除旧版POI) --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.4</version> <exclusions> <!-- 排除所有旧版POI --> <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> <!-- 补充 Schema 依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>ooxml-schemas</artifactId> <version>1.4</version> </dependency> </dependencies> ``` --- ### 操作步骤 1. **检查依赖树** ```bash mvn dependency:tree | grep poi ``` 查找冲突的 POI 版本(如 `poi-3.17` 和 `poi-5.2.5` 共存) 2. **排除冲突依赖** 在引入 EasyExcel 的依赖中添加 `<exclusions>` 块,移除其传递的旧版 POI 3. **强制指定版本** 显式声明新版 POI 依赖(确保所有 POI 子模块版本一致) 4. **清理重建** ```bash mvn clean install -U ``` --- ### 冲突排查技巧 | 工具 | 操作 | 目标 | |------|------|------| | IDEA | 右键项目 → Maven → Show Dependencies | 查看 POI 依赖路径 | | Maven | `mvn dependency:tree -Dincludes=org.apache.poi` | 定位冲突来源 | | 命令行 | `mvn help:effective-pom` | 检查最终生效的依赖版本 | --- ### 验证代码 ```java public void export(HttpServletResponse response) { try { // 修复后导出测试 EasyExcel.write(response.getOutputStream, User.class) .sheet("测试页") .doWrite(dataList); // 应正常执行 } catch (Exception e) { e.printStackTrace(); } } ``` --- ### 常见冲突场景 ```mermaid graph TD A[项目] --> B[easyexcel-3.3.4] A --> C[common-service-1.0] B --> D[poi-5.2.5] C --> E[poi-ooxml-3.17] <!-- 冲突源 --> D --> F[Factory.class] E --> F[Factory.class] <!-- 版本不匹配 --> ``` --- ### 相关问题 1. 如何查看 Maven 依赖冲突的具体路径? 2. EasyExcel 3.x 兼容哪些 POI 版本? 3. 排除依赖时通配符 `*` 的使用限制是什么? 4. Spring Boot 项目中如何统一 POI 版本? 5. 除了 POI 冲突,还有哪些原因会导致 `NoSuchFieldError`? [^1]: 删除依赖是临时方案,会导致功能缺失 [^2]: POI 5.x 的 `Factory` 类结构与 3.x 不兼容 [^3]: 统一版本并补充 `ooxml-schemas` 是最佳实践
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值