尝试读取 .xlsm 文件时出现 java.lang.NoSuchMethodError

Posted

技术标签:

【中文标题】尝试读取 .xlsm 文件时出现 java.lang.NoSuchMethodError【英文标题】:java.lang.NoSuchMethodError when trying to read .xlsm file 【发布时间】:2013-08-29 15:24:43 【问题描述】:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setSaveAggressiveNamespaces()Lorg/apache/xmlbeans/XmlOptions;
at org.apache.poi.POIXMLDocumentPart.<clinit>(POIXMLDocumentPart.java:56)
at rulebooksToExcel.GenerateExcel.generateExcel(GenerateExcel.java:34)
at rulebooksToExcel.ParseNortDocFiles.main(ParseNortDocFiles.java:165)

我在以下位置收到错误:

workbook = new XSSFWorkbook(in);

我读过其他类似的问题,但他们都建议使用 XMLBeans 版本 2.0+。但我使用的是 2.6,我找不到任何其他解释可能导致此问题的原因。

【问题讨论】:

How to solve a NoSuchMethodError when using POI for doc files的可能重复 看起来您正在运行一个非常旧的 xmlbeans 副本...您可以尝试升级到受支持的版本 (2.3+) 并重试吗? @Gagravarr,正如我在问题中提到的,我使用的是 XMLBeans 2.6。 @BeginnerJava 根据POI FAQ,您是否确认您实际上使用的是正确版本的 POI jar? 您确定您使用的是您认为的 XMLBeans 版本吗?仅当您将 1.x 和 2.x 放在类路径中时,您才会认为您使用的是 2.x,但很可能您仍会使用 1.x! 【参考方案1】:

我在 Java8 中遇到了同样的错误。

This接受的答案帮助了我:

我在代码中添加了以下几行:

ClassLoader classloader = XmlOptions.class.getClassLoader();
        URL res = classloader.getResource(
                 "org/apache/xmlbeans/XmlOptions.class");
        String path = res.getPath();
        LOGGER.debug("XmlOptions.class loaded from " + path);

事实证明,如果您使用 Java8 JRE 来运行您的应用程序,您会在日志中得到以下信息: XmlOptions.class 从文件加载:/C:/Program%20Files/Java/jre1.8.0_131/lib/ext/xbean.jar!/org/apache/xmlbeans/XmlOptions.class

所以在 Java8 中,JRE/lib/ext 中有一个 apache xmlbeans jar,无论您的类路径设置如何,都会首先加载它!

当我将 JAVA_HOME/PATH 更改为指向我安装的 JDK8 时,问题解决了。

经过短暂检查后,JRE7 也是如此。 问题是 JRE 捆绑的 xbean.jar 在这两种情况下都包含 XmlOptions::setSaveAggresiveNamespaces(带有一个 's')。

(我使用的POI版本是3.17,因为这个版本兼容Java7。)

更新:事实证明这在我的公司环境(准备好的机器/组策略)中是正确的,在我的 PC 上的家里没有这样的 jar。

【讨论】:

【参考方案2】:

在应用服务器环境中,您的类路径中可能有旧版本的 xmlbeans(如 m4gic 所说)。

我运行该代码 sn-p 并看到 XmlOptions 正在从 Weblogic 模块加载;

XmlOptions.class loaded from file:/home/bea/bea12214/wlserver/modules/com.bea.core.xml.xmlbeans.jar!/org/apache/xmlbeans/XmlOptions.class

我通过强制 Weblogic 为 xmlbeans 使用应用程序包解决了这个问题。 (对于战争类型的部署,它位于 WEB-INF 文件夹下的 weblogic.xml 中)

 <wls:prefer-application-packages>
     ...
     <wls:package-name>org.apache.xmlbeans.*</wls:package-name>
 </wls:prefer-application-packages>

【讨论】:

以上是关于尝试读取 .xlsm 文件时出现 java.lang.NoSuchMethodError的主要内容,如果未能解决你的问题,请参考以下文章

尝试在映射服务器上将 XLSM 保存为 CSV 时出现“对象 _workbook 的方法保存失败”错误

使用 openpyxl 打开 .xlsm 文件时出现问题

为啥打开 .xlsm 而不是 .xls 时出现 python xlrd 错误

当我尝试在 Android 11 中读取文件时出现电容器文件系统错误

尝试从 Java 中的二进制文件中读取 Int 时出现 BufferUnderflowException

读取 BMP 文件 C++(读取 BMP 标头时出现问题)