Java ApachePOI在Linux环境中读取xlsx文件时引发异常
目前我使用的是ApachePOI的最新版本,即4.1.1。对于xls文件,一切都很正常。甚至对于开发环境Windows中的xlsx文件。但我在实时环境Red Hat Linux中遇到了一个例外 我已经搜索了一些解决方案,这些解决方案大多被认为使用了正确的xmlbeans依赖关系。我正在使用xml-beans-3.1.0.jarJava 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
我正在从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>