使用GX X EVO 3打开Excel文件时出现NoSuchMethodError错误求助
问题:调用FileExcel.Open打开XLS文件时抛出NoSuchMethodError
执行代码
&Error = &FileExcel.Open(&FileName)
报错信息
at java.base/java.lang.Thread.run(Thread.java:829) Caused by: java.lang.NoSuchMethodError: 'org.apache.poi.poifs.filesystem.DirectoryNode org.apache.poi.poifs.filesystem.POIFSFileSystem.getRoot()
环境配置
- GX X EVO 3 U7
- Ubuntu 20.04
- Tomcat 9.0.31
- Java版本:openjdk 11.0.17 2022-10-18
已尝试的POI版本
- poi-3.17.jar, poi-ooxml-3.17.jar, poi-ooxml-schemas-3.17.jar
- poi-3.8.jar, poi-ooxml-3.8.jar, poi-ooxml-schemas-3.8.jar
其他配置
使用无头模式LibreOffice,启动命令:
sudo /usr/bin/soffice --nologo --headless --nofirststartwizard --accept='socket, host=127.0.0.1,port=8100;urp;StarOffice.Service' &
已按官方文档完成配置,但问题仍存在,寻求技术支持。
解决方案
1. 清理POI版本冲突
NoSuchMethodError核心原因是类路径中存在版本不兼容或重复的POI依赖:
- 彻底清理Tomcat项目
WEB-INF/lib目录,只保留一套完整的POI相关Jar包,删除所有其他版本的冗余文件,避免类加载冲突。 - 确保所有POI组件版本完全一致,包括
poi、poi-ooxml、poi-ooxml-schemas,同时补充POI必需的依赖包:commons-codec、commons-collections4、commons-io、curvesapi、xmlbeans,缺失这些依赖也会触发异常。
2. 匹配Genexus官方适配版本
Genexus X EVO 3 U7对POI版本有明确适配要求:
- POI 3.8与3.17之间存在API签名变更:旧版
POIFSFileSystem.getRoot()返回DirectoryEntry,3.17版本返回DirectoryNode,若Genexus底层代码基于旧版编写,使用3.17会导致方法签名不匹配,反之亦然。 - 优先使用Genexus官方提供的POI依赖包,而非自行下载第三方版本,确保版本完全适配。
3. 排除LibreOffice干扰
虽然报错来自POI,但需验证LibreOffice是否存在资源冲突:
- 停止当前LibreOffice服务,单独通过POI尝试打开文件,若问题消失,说明两者存在资源竞争,需调整LibreOffice启动参数或隔离运行环境。
4. 检查全局类路径
- 排查Tomcat全局类路径(如
CATALINA_BASE/lib),确认不存在其他版本的POI包,避免全局Jar包覆盖项目依赖。
内容的提问来源于stack exchange,提问作者Jose Martinez
相关产品推荐
相关产品推荐

