如何搭建 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,我在中文互联网翻了几十个博文硬是没一篇文章提到这点,真是哭笑不得。