You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Apache POI的getInsList方法时遭遇NoClassDefFoundError问题求助

解决Apache POI中调用getInsList()抛出NoClassDefFoundError的问题

你遇到的是典型的依赖缺失/版本不兼容问题,java.lang.NoClassDefFoundError: org/openxmlformats/schemas/wordprocessingml/x2006/main/impl/CTTblImpl$1InsList这个错误说明JVM在运行时找不到对应的OOXML schema实现类,下面是具体的排查和解决步骤:

核心原因

Apache POI处理Word的OOXML格式时,依赖于OpenXML格式的schema实现类。这些类在不同POI版本中的依赖方式不同:

  • POI 5.0及以上版本:poi-ooxml依赖已经包含了所有必要的schema类,无需单独引入额外包
  • POI 4.x及更早版本:需要单独引入poi-ooxml-schemas依赖,且版本必须和poi-ooxml完全一致

具体解决方法

1. 检查并修正Maven/Gradle依赖

如果使用Maven:

  • POI 5.x版本(推荐):
<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.5</version> <!-- 替换为你实际使用的POI版本 -->
    </dependency>
</dependencies>
  • POI 4.x或更早版本
<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version> <!-- 版本必须统一 -->
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>4.1.2</version> <!-- 和poi-ooxml版本完全一致 -->
    </dependency>
</dependencies>

如果使用Gradle:

  • POI 5.x版本
dependencies {
    implementation 'org.apache.poi:poi-ooxml:5.2.5' // 替换为你的POI版本
}
  • POI 4.x或更早版本
dependencies {
    implementation 'org.apache.poi:poi-ooxml:4.1.2'
    implementation 'org.apache.poi:poi-ooxml-schemas:4.1.2'
}

2. 避免版本冲突

务必确保所有POI相关依赖的版本完全一致,不要混合不同版本的poipoi-ooxmlpoi-ooxml-schemas,否则很容易出现类加载异常。

3. 手动导入Jar包的情况

如果是手动管理Jar包,需要:

  • 下载对应版本的poi-ooxml.jar
  • 对于POI 4.x及更早版本,还要下载对应版本的poi-ooxml-schemas.jar
  • 将这两个Jar包添加到项目的类路径中(比如IDE的Library配置里)

4. 清理IDE缓存

有时候IDE的缓存会导致依赖无法正确加载,可以尝试:

  • IntelliJ IDEA:File -> Invalidate Caches... -> 勾选Clear file system cache and local history -> Invalidate and Restart
  • Eclipse:Project -> Clean... -> 选择你的项目 -> Clean

验证修复

当依赖配置正确后,重新运行你的代码:

CTTbl cttbl = technologyTable.getCTTbl(); 
cttbl.getInsList().stream().forEach(System.out::println);

此时CTTblImpl$1InsList类应该能被正常加载,NoClassDefFoundError异常会消失。

内容的提问来源于stack exchange,提问作者youyang

火山引擎 最新活动