You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.2.x升级后JSTL引用报错的解决方法咨询

解决Spring Boot 2.2.x升级后JSTL URI无法解析的问题

我来帮你搞定这个问题,之前升级Spring Boot时我也碰到过类似的坑,下面是具体的排查和解决步骤:

一、快速修复:调整依赖与Tomcat扫描配置

1. 统一Tomcat依赖版本,避免手动指定冲突

你手动给tomcat-embed-jasper指定了9.0.40版本,但Spring Boot 2.2.x有自己适配的默认Tomcat版本,硬写版本号容易引发兼容性问题。修改Gradle依赖,去掉手动指定的版本号:

dependencies {
    // Spring Boot
    implementation 'org.springframework.boot:spring-boot-starter-web'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    // Web
    implementation 'javax.servlet:jstl:1.2'
    // 去掉手动版本,让Spring Boot自动管理适配的Tomcat Jasper版本
    implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
}

2. 用配置文件替代VM参数,优化TLD扫描规则

你之前靠VM参数指定扫描Jar,但Spring Boot 2.2.x支持通过配置文件更优雅地设置,避免每次启动都加参数。在application.properties中添加:

# 指定需要扫描标签库定义(TLD)的Jar包
server.tomcat.jar-scan-filter.jars-to-scan=jstl*.jar,tomcat-embed-jasper*.jar,spring-webmvc*.jar
# 清空额外的TLD跳过规则,确保核心Web依赖不会被遗漏
server.tomcat.additional-tld-skip-patterns=

如果用YAML配置则是:

server:
  tomcat:
    jar-scan-filter:
      jars-to-scan: jstl*.jar,tomcat-embed-jasper*.jar,spring-webmvc*.jar
    additional-tld-skip-patterns: ""

3. 本地开发时临时调整Tomcat依赖范围(可选)

如果你本地用内嵌Tomcat运行项目,providedRuntime类型的spring-boot-starter-tomcat可能偶尔出现依赖加载不及时的情况,可以临时改成implementation,部署到外部Tomcat时再改回providedRuntime:

// 本地开发时使用
implementation 'org.springframework.boot:spring-boot-starter-tomcat'
// 部署到外部Tomcat时切换回
// providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'

二、为什么Spring Boot 2.2.x会出现这个问题?

你没在发布说明里找到相关变更很正常,因为这是Tomcat自动配置的细微调整,不属于核心JSP/JSTL的破坏性变更:

  • Spring Boot 2.2.x升级了内嵌Tomcat版本,同时为了提升启动速度,收紧了默认的Jar扫描过滤规则,默认会跳过大部分非必要Jar的TLD(标签库定义文件)扫描。
  • 这个规则导致JSTL的META-INF/c.tld、fn.tld等核心文件所在的Jar没被Tomcat扫描到,因此无法解析对应的URI。
  • 而Spring Boot 2.1.x的Tomcat扫描规则更宽松,会自动扫描这些Web核心依赖的TLD文件,所以之前能正常运行。

三、验证解决方案

修改完成后重启应用,访问包含JSTL标签的JSP页面,应该就能正常加载了。如果还是有问题,可以:

  • 检查jstl-1.2.jar是否在项目的classpath中(可在IntelliJ的External Libraries里查看)
  • 清理Gradle缓存后重新构建:运行./gradlew clean build --refresh-dependencies

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:32:38