POI从4升级至5.2.1时遭遇NoClassDefFoundError问题求助
Apache POI 4升级到5.2.1后出现NoClassDefFoundError的解决建议
问题描述
升级Apache POI从4.x版本到5.2.1后,抛出以下类未找到错误:
java.lang.NoClassDefFoundError: org/apache/xmlbeans/impl/schema/DocumentFactory at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook.<clinit>(CTWorkbook.java:22) at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:475) at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:232) at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:226) at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:214) at com.leanapps.businesslayer.ejb.importparticipants.helper.ImportParticipantsHelper.determineExcelWorkbook(ImportParticipantsHelper.java:307) at com.leanapp
当前使用的Maven POM配置:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${poi.version}</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-lite</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi.version}</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-lite</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-full</artifactId> <version>${poi.version}</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-lite</artifactId> </exclusion> </exclusions> </dependency>
当前使用xmlbeans版本为3.1.0,预期正常下载Excel文件,实际出现上述错误。
解决建议
1. 修正依赖冗余与错误排除配置
- 无需同时引入
poi-ooxml和poi-ooxml-full,二者选其一即可:poi-ooxml-full包含完整的OOXML schema定义,poi-ooxml默认使用轻量版poi-ooxml-lite。 - 移除对
poi-ooxml-schemas和poi-ooxml-lite的排除配置:CTWorkbook等类依赖这些schema定义,排除后会导致类加载失败。
2. 匹配POI 5.2.1兼容的xmlbeans版本
POI 5.2.1官方要求的xmlbeans版本为5.1.0,当前使用的3.1.0版本过低,存在兼容性问题,org/apache/xmlbeans/impl/schema/DocumentFactory在低版本中可能不存在或包结构变更。
3. 优化后的POM配置示例
<!-- 核心POI依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.1</version> <scope>provided</scope> </dependency> <!-- 完整OOXML支持依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-full</artifactId> <version>5.2.1</version> <scope>provided</scope> </dependency> <!-- 明确指定兼容的xmlbeans版本 --> <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>5.1.0</version> <scope>provided</scope> </dependency>
4. 验证依赖树
执行mvn dependency:tree命令,检查是否存在xmlbeans版本冲突,确保最终依赖的xmlbeans版本为5.1.0,无低版本xmlbeans被引入。
5. 检查运行环境依赖
由于依赖scope设置为provided,需确认应用服务器等运行环境提供的xmlbeans版本是否为5.1.0;若容器提供旧版本,可将scope改为compile,或在容器中替换为兼容版本。
内容的提问来源于stack exchange,提问作者Deviprasanna Yepuri
相关产品推荐
相关产品推荐

