Spring Boot项目部署到Tomcat运行报FileFormatUtil类找不到错误
问题描述
搭建Spring Boot项目时引入最新版aspose-cells依赖,编写用于校验文件安全性的isSafe方法,核心逻辑为调用FileFormatUtil类的相关方法检测Excel文件格式,方法代码片段如下:
public static boolean isSafe(File f) throws Exception { boolean safeState = false; // try { if ((f != null) && f.exists() && f.canRead()) { // Perform a first check on Excel document format FileFormatInfo formatInfo = FileFormatUtil.detectFileFormat(f.getAbsolutePath()); String formatExtension = FileFormatUtil.loadFormatToExtension(formatInfo.getLoadFormat());
运行现象存在明显差异:
- Spring Boot内置容器启动项目时,
isSafe方法可正常执行,无任何报错 - 项目打包部署到外部Apache Tomcat服务器运行、调用该方法时,抛出异常:
java.lang.NoClassDefFoundError: com/aspose/cells/FileFormatUtil
相关参考截图: - 内置容器运行正常截图:

- Tomcat部署报错截图:

- 依赖配置截图:

根因定位
异常核心原因是外部Tomcat部署时,类加载路径下找不到com.aspose.cells.FileFormatUtil对应的类文件。内置容器能正常运行是因为Spring Boot可执行fat jar打包时会把所有compile范围的依赖打进jar包,类加载器可以正常扫描到依赖类;部署到外部Tomcat时出现类缺失,常见诱因有3种:
- 依赖scope配置错误:
aspose-cells依赖被设置为provided/test范围,这两类范围的依赖不会被打进war包的WEB-INF/lib目录 - 本地引入的aspose jar未被纳入打包资源:如果
aspose-cells是通过系统路径导入的本地jar、未发布到maven仓库,默认打包逻辑不会将该jar带入war包 - Tomcat类加载冲突:Tomcat优先加载自身
lib目录下的jar包,如果该目录下存在版本不匹配的aspose相关jar,会优先加载旧版本类,缺失FileFormatUtil相关实现
修复方案
按以下顺序逐一排查修复即可:
- 修正依赖scope配置
检查项目pom.xml(Maven)或build.gradle(Gradle)中的aspose-cells依赖配置,删除provided/test类的scope配置,使用默认的compile范围即可,Maven配置参考:<dependency> <groupId>com.aspose</groupId> <artifactId>aspose-cells</artifactId> <version>对应使用的版本号</version> </dependency> - 补全本地jar的打包规则
如果是本地导入的aspose jar,先通过mvn install命令将jar安装到本地maven仓库再按正常依赖引入,或者在maven-war-plugin插件中显式配置将本地jar纳入打包资源。 - 校验war包内容
执行打包命令后解压生成的war包,查看WEB-INF/lib目录下是否存在aspose-cells对应的jar包,确认依赖确实被打入部署包后再部署到Tomcat。 - 清理Tomcat冲突包
进入Tomcat安装目录下的lib文件夹,检查是否存在非业务自带的aspose相关jar包,存在则直接删除,避免Tomcat优先加载错误版本的类。
内容的提问来源于stack exchange,提问作者Sahil M
相关产品推荐
相关产品推荐

