部署时classpath引用jakarta.servlet.jsp.jstl-api-2.0.0.jar不存在如何解决
部署报错:classpath引用jakarta.servlet.jsp.jstl-api-2.0.0.jar不存在 排查与解决方案
排查步骤
- 校验本地依赖与构建产物完整性:Maven项目检查本地仓库路径
jakarta/servlet/jsp/jstl/jakarta.servlet.jsp.jstl-api/2.0.0/下是否存在完整jar包,确认无下载失败生成的.lastUpdated标记文件;Gradle项目检查对应缓存目录文件完整性,同时校验部署包内的依赖目录(传统WAR包看WEB-INF/lib、Spring Boot可执行jar看BOOT-INF/lib)是否包含该jar。 - 检查依赖作用域配置:确认该依赖没有被配置为
provided、testImplementation等不会随项目打包的作用域,这类作用域的依赖不会被带入部署产物,运行时必然报classpath缺失。 - 检查依赖排除规则与冲突:全局搜索构建配置文件(Maven为pom.xml、Gradle为build.gradle/build.gradle.kts),确认没有配置针对
jakarta.servlet.jsp.jstl-api的全局排除规则,同时排查是否有其他依赖传递引入了不同坐标、不同版本的JSTL包造成冲突。 - 检查运行容器兼容性:注意:jakarta.servlet.jsp.jstl-api 2.0.0属于Jakarta EE 9+规范组件,仅适配Tomcat 10+、Jetty 11+、WildFly 22+及以上版本的容器,如果使用Tomcat 9及更低版本(采用javax.servlet命名空间),会因为命名空间不匹配无法识别该jar,抛出类路径缺失错误。
解决方案
- 依赖缓存损坏场景:删除本地仓库/缓存中对应
jakarta.servlet.jsp.jstl-api/2.0.0的目录,强制刷新依赖重新构建:- Maven执行命令:
mvn clean install -U - Gradle执行命令:
./gradlew build --refresh-dependencies
- Maven执行命令:
- 依赖作用域配置错误场景:调整依赖作用域为运行时/编译范围,确保依赖会被打包进部署产物,参考配置如下:
Maven依赖配置:
Gradle依赖配置:<dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>2.0.0</version> <scope>compile</scope> </dependency>implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:2.0.0' - 依赖排除/冲突场景:删除不必要的全局排除规则,若存在多版本JSTL冲突,在构建配置中统一JSTL版本为2.0.0,排除其他不兼容的JSTL依赖。
- 容器版本不兼容场景:二选一调整即可:
- 升级Web容器到支持Jakarta EE 9+的版本,同步将项目内所有servlet、jsp相关依赖切换为jakarta分组的对应版本
- 若必须使用老版本容器(Tomcat 9及以下),将JSTL降级为适配javax命名空间的1.2.x版本,同步将所有servlet、jsp相关依赖切回javax.servlet分组的对应版本,避免命名空间混用。
- 特殊场景说明:使用Spring Boot以可执行jar方式部署时,JSP相关依赖默认不会被打入可执行jar,需要额外配置打包参数确保JSTL相关依赖被包含在部署产物中。
内容的提问来源于stack exchange,提问作者entrepreneurSam
相关产品推荐
相关产品推荐

