在使用apache.poi导出excel文件时, debug到new XSSFWorkbook();就报空指针(用HSSFWorkbook没问题),怀疑是以来缺失或类加载导致,排查pom.xml也没问题,依赖都在且没有传递依赖。
然后分析可能xmlbeans有问题,XSSFWorkbook( .xlsx)底层依赖 XML 解析库 xmlbeans,而 HSSFWorkbook( .xls)只依赖基础 POI,不涉及 XML。当 JVM 尝试初始化 XSSFWorkbook 时,会静态加载一些类,如 org.apache.xmlbeans.XmlObject,如果这些类不存在或加载失败,某些内部初始化代码可能返回 null,后续调用就会抛出 NullPointerException,而不是 NoClassDefFoundError。所以检查xmlbeans是否真的存在:
mvn dependency:tree | findstr "xmlbeans"
发现有多个版本,然后在dependencyManagement中显式加入指定版本的xmlbeans,确保只有一个版本后,再次运行,无报错。
XML
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>5.0.3</version>
</dependency>
</dependencies>
</dependencyManagement>