Java ApachePOI在Linux环境中读取xlsx文件时引发异常

Java ApachePOI在Linux环境中读取xlsx文件时引发异常,java,excel,apache-poi,xlsx,Java,Excel,Apache Poi,Xlsx,目前我使用的是ApachePOI的最新版本,即4.1.1。对于xls文件,一切都很正常。甚至对于开发环境Windows中的xlsx文件。但我在实时环境Red Hat Linux中遇到了一个例外 我已经搜索了一些解决方案,这些解决方案大多被认为使用了正确的xmlbeans依赖关系。我正在使用xml-beans-3.1.0.jar 我正在从eclipse导出war文件,并在OracleWebLogic12c中发布 以下是堆栈跟踪: org.apache.poi.ooxml.POIXMLExcepti

目前我使用的是ApachePOI的最新版本,即4.1.1。对于xls文件,一切都很正常。甚至对于开发环境Windows中的xlsx文件。但我在实时环境Red Hat Linux中遇到了一个例外

我已经搜索了一些解决方案,这些解决方案大多被认为使用了正确的xmlbeans依赖关系。我正在使用xml-beans-3.1.0.jar


我正在从eclipse导出war文件,并在OracleWebLogic12c中发布

以下是堆栈跟踪:

org.apache.poi.ooxml.POIXMLException: org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions;
        at org.apache.poi.ooxml.POIXMLFactory.createDocumentPart(POIXMLFactory.java:66)
        at org.apache.poi.ooxml.POIXMLDocumentPart.read(POIXMLDocumentPart.java:657)
        at org.apache.poi.ooxml.POIXMLDocument.load(POIXMLDocument.java:180)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:282)
        at org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.createWorkbook(XSSFWorkbookFactory.java:88)
        at org.apache.poi.xssf.usermodel.XSSFWorkbookFactory.createWorkbook(XSSFWorkbookFactory.java:135)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.poi.ss.usermodel.WorkbookFactory.createWorkbook(WorkbookFactory.java:341)
        at org.apache.poi.ss.usermodel.WorkbookFactory.createXSSFWorkbook(WorkbookFactory.java:316)
        at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:234)
        at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:200)
        ...............................................................................
        ...............................................................................

Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:56)
        at org.apache.poi.ooxml.POIXMLFactory.createDocumentPart(POIXMLFactory.java:63)
        ... 181 more
Caused by: java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions;
        at org.apache.poi.ooxml.POIXMLTypeLoader.<clinit>(POIXMLTypeLoader.java:43)
        at org.apache.poi.xssf.model.ThemesTable.<init>(ThemesTable.java:86)
        ... 187 more

Caused by: java.lang.NoSuchMethodError: org.apache.xmlbeans.XmlOptions.setEntityExpansionLimit(I)Lorg/apache/xmlbeans/XmlOptions;
我怀疑您的类
org.apache.xmlbeans.XmlOptions
并非真正来自
xmlbeans-3.1.0.jar
,而是来自任何可能包含旧版本
org.apache.xmlbeans.

您可以使用以下代码检测类的来源:

ClassLoader classloader =
    org.apache.xmlbeans.XmlOptions.class.getClassLoader();
java.net.URL res = classloader.getResource(
    "org/apache/xmlbeans/XmlOptions.class");
String path = res.getPath();
System.out.println("XmlOptions came from " + path);

我通过在weblogic.xml中设置以下内容来绕过此错误:

<container-descriptor>      
    <prefer-application-packages>
       <package-name>org.apache.*</package-name>
    </prefer-application-packages>  
</container-descriptor>

org.apache*

WebLogic12c有一个旧版本(2.0)的XMLBeans

你能发布你的类路径的内容吗?只是为了确保XMLBeans版本中确实没有冲突。确保这与Linux或Windows环境无关。由于类路径中的问题,它正在您的开发环境中运行,而不是在服务器中运行。由于您没有提供更多信息,请检查您是如何打包应用程序的。问题可能就在那里。这是“但它在我的机器上工作!”的经典案例我正在从eclipse导出war文件,并在OracleWebLogic12c中发布。我已经用我使用过的库列表更新了这个问题。请查收,谢谢大家。我检查并发现,在服务器中,它实际上指向一个不同的xmloptions类。我降级到poi 3.7包。尽管它仍然指向weblogic服务器jar。但解决了我的问题。
<container-descriptor>      
    <prefer-application-packages>
       <package-name>org.apache.*</package-name>
    </prefer-application-packages>  
</container-descriptor>