如何搭建 Gradle + Tomcat 10 + jstl3 的环境
Tomcat10改用了Jakarta,导致javax开头的包全炸了
导入依赖
经过实测,导入以下三个包即可正常使用 jsp。使用 IDEA 编写时,jsp 文件关于 taglib 的提示也是正常的。
第一个包
不导入这个 API 不会导致无法运行,但是会让 IDEA 的部分自动补全无法使用,如${pageContext.request.contextPath}
在项目结构里将 Tomcat 的 lib 导入并没有效果, Gradle 并不吃这一套
compileOnly("jakarta.servlet.jsp:jakarta.servlet.jsp-api:3.1.1")
第二个包
implementation("jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:3.0.0")
如果没有的话会报错 NoClassDefFoundError: jakarta/servlet/jsp/jstl/core/LoopTag
第三个包
implementation("org.glassfish.web:jakarta.servlet.jsp.jstl:3.0.1")
如果没有这个包但是有standard包会报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]
否则报这个错:未能加载或实例化TagLibraryValidator类:[org.apache.taglibs.standard.tlv.JstlCoreTLV]
迁移 taglib 的 URL 至 URN
将 jsp 文件中的
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
修改为
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
如果有其余标签,按照这个格式迁移即可
将 tld 文件从 jar 文件中复制到 WEB-INF
从 IDEA 的外部库中找到org.glassfish.web:jakarta.servlet.jsp.jstl
的库文件,展开它下面的 META-INF 文件夹,将里面你用得到的 tld 文件复制到 webapp 下的 WEB-INF 文件夹中
后记
这个问题搞得我狂掉头发。中文互联网一搜,要么让你降版本,要么干脆就是老版本的教程,还有一大批复制粘贴的在里面浪费时间。而 JSTL 本身文档也稀烂,伴随着 Java 迁移 Jakarta 问题更是层出不穷。倒是去 Google 一看,就提到了迁移 URL 至 URN,我在中文互联网翻了几十个博文硬是没一篇文章提到这点,真是哭笑不得。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体