Spring Boot引入tomcat-embed-jasper报failed to scan,如何同时用本地仓与JSP
Spring Boot 同时使用父级本地Maven仓库 + JSP解析的可行方案
先排查你当前依赖里的隐性配置坑
你现在遇到的“加Jasper就报扫描失败”的问题,不是Jasper本身和父仓库不兼容,大多是现有pom配置里的冗余、错误叠加出来的问题,三个最常见的触发点:
- 重复声明了两次完全一样的
tomcat-embed-jasper依赖,重复引入会让Maven在多层嵌套的父本地仓库结构下做冗余校验,很容易触发扫描异常 - 同时引入了
spring-boot-starter-web(Servlet栈)和spring-boot-starter-webflux(响应式栈),两个技术栈的类路径默认配置相互冲突,会在依赖扫描阶段触发不必要的类路径校验逻辑 - 引入了早就停更的
org.projectreactor:reactor-spring:1.0.1.RELEASE,这个组件多年前就被Spring官方合并进核心spring-web模块,完全没有适配当前Spring Boot版本的依赖元数据,是你看到“找不到不存在的异常jar”报错的核心原因——这个旧依赖的元数据缺失,和Jasper的provided范围配置叠加,才会逼得你现在要在JSP和父仓库之间二选一
调整配置实现两个需求共存
- 删掉重复的
tomcat-embed-jasper声明,只保留单份依赖,把它的scope从provided改成compile:之前把Jasper设为provided范围时,Maven会在依赖扫描阶段跳过对它的元数据校验,在嵌套父仓库的场景下,这种跳过逻辑会让Maven把没做校验的依赖当成缺失的异常资源,直接触发扫描失败;改成compile范围后,Maven会主动在父仓库定位对应依赖的校验信息,不会触发跳过逻辑 - 给
tomcat-embed-jasper、javax.servlet:jstl两个依赖显式声明和你当前Spring Boot版本匹配的固定版本号,不要让它们走Spring Boot的版本仲裁逻辑:版本仲裁逻辑在多层嵌套的仓库结构下会触发二次版本校验,很容易导致扫描失败 - 把
tomcat-embed-jasper及其传递依赖(比如ecj编译器、jasper-el标签库支持包)的对应jar和元数据文件同步到父级本地Maven仓库,从根源解决扫描时的元数据缺失问题 spring-boot-starter-tomcat的provided配置不需要改动,保持原样即可
落地验证步骤
- 改完配置后,执行
mvn clean dependency:tree命令生成完整依赖树,确认没有重复依赖、没有元数据缺失的路径 - 启动应用前,确认JSP视图的解析配置:视图前缀配为
/WEB-INF/jsp/、视图后缀配为.jsp,如果完全不用Thymeleaf可以直接关掉它的自动配置 - 如果还是偶发扫描报错,可以在Maven运行参数里关闭嵌套仓库的全路径遍历扫描,避免Maven在父仓库的所有层级里反复检索Jasper的依赖元数据
内容的提问来源于stack exchange,提问作者scriptfoo
相关产品推荐
相关产品推荐

