如何搭建 Gradle + Tomcat 10 + jstl3 的环境
  EmepYCKahq0N 2023年11月01日 66 0

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   55   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   114   0   0 Java
  8s1LUHPryisj   2024年05月17日   49   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
EmepYCKahq0N