当使用 Apache POI 创建工作簿对象来处理输入流时,我开始收到错误:
java.lang.NoClassDefFoundError: 无法初始化类 org.apache.poi.ooxml.util.DocumentHelper
我一步一步发现它出现在 ContentTypeManager.class(来自 org.apache.poi.openxml4j.opc.internal)的这段代码的第一行代码中:
private void parseContentTypesFile(InputStream in) throws InvalidFormatException {
try {
Document xmlContentTypetDoc = DocumentHelper.readDocument(in);
NodeList defaultTypes = xmlContentTypetDoc.getDocumentElement().getElementsByTagNameNS("http://schemas.openxmlformats.org/package/2006/content-types", "Default");
int defaultTypeCount = defaultTypes.getLength();
....
所以 DocumentHelper.readDocument(in) 行使用的是 javax.xml.parsers.DocumentBuilder,这就是问题最终所在,它无法创建 DocumentBuilder。我尝试删除 xercesImpl 但没有效果。
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.12.1</version>
</dependency>
代码使用WildFly服务器运行成功,但在JBOSS下运行失败。我们正在转向 WildFly,但与此同时生产仍在运行 JBOSS。
关于如何解决错误的任何想法?该项目还具有 tika-core 和 tika-parsers-standard-package 依赖项,不确定这些是否会导致 JBOSS 下出现问题。以前这一直在 JBOSS 下工作。
更新:我的 POM 有这些与问题相关的条目:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.12.2</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers-standard-package</artifactId>
<version>2.7.0</version>
</dependency>
所以我想通了这个问题,想跟进。为了让应用程序在 WildFly 下运行,我不得不添加一些日志记录排除项,因为对于 WildFly,类路径上已经存在导致冲突的记录器。但是,当在 JBOSS 中运行时,除了 POI 之外,应用程序的所有部分显然都能正常工作,因为 DocumentBuilder 在类路径上找不到所需的日志记录依赖项。一旦我恢复了 JBOSS 的 POM 中的日志记录排除,它就解决了这个问题。