4
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,我找不到任何其他解释可能导致此问题的原因。

4

2 回答 2

0

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

我运行该代码片段并看到 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>
于 2021-12-01T10:29:45.213 回答
0

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

这个接受的答案帮助了我:

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

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 loaded from file:/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。

于 2018-09-11T07:45:05.910 回答