关于maven项目中Tomcat10与JSTL问题汇总(Debug亲身经历)


如果你在学习 web项目过程中遇到以下三种错误,那么本篇可能会对你有所帮助:

1 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

2 java.lang.NoClassDefFoundError:javax/servlet/jsp/tagext/TagLibraryValidator

3 java.lang.NoClassDefFoundError:jakarta/servlet/jsp/jstl/core/LoopTag

问题描述与解决方法

这里先总结出解决方法

问题1:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

在这里插入图片描述

如果你的web服务器是10.0及以上,那么你可以在pom.xml中导入jstl依赖

<dependency>
	<groupId>org.glassfish.web</groupId>
	<artifactId>jakarta.servlet.jsp.jstl</artifactId>
	<version>2.0.0</version>
</dependency>

并且你需要将jakarta.servlet.jsp.jstl-2.0.0.jar解压,并从其META-INF文件夹中取出你需要的.tld文件,(一般c.tld就够用了)
在这里插入图片描述
并把这个文件导入到你项目的WEB-INF,这样启动的时候Tomcat服务器就可以编译到这个文件。

然后一定记得(假设你用的是idea,因为其它的我没用过)对maven项目做这些:

clean->validate->compile->install, 然后rebuild你的module,接着重启tomcat,正常情况下问题是可以解决的。关于问题分析可以翻到下一节

如果你的web服务器是9.0及以下,那么你可以在pom.xml中引入jstl依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

引用格式可以参考JSTL的官网:http://tomcat.apache.org/taglibs/standard/

或者从官网下载一份jstl-1.2.jar拷贝到WEB-INF/lib中,并且解压jstl-1.2.jar将其中的META-INF中的tld文件拷贝到你的WEB-INF文件夹下,当然一定记得(假设你用的是idea,因为其它的我没用过)对maven项目做这些:

clean->validate->compile->install, 然后rebuild你的module,接着重启tomcat,正常情况下问题是可以解决的。关于问题分析可以翻到下一节

详细可以参考:

问题2:java.lang.NoClassDefFoundError:javax/servlet/jsp/tagext/TagLibrary Validator

在这里插入图片描述

假设你使用的Tomcat服务器是10.0及以上,那么大概率是在WEB-INF文件夹下,导入了x.tld文件,解决方法可以通过以上引入依赖的方式,也可以将jakarta.servlet.jsp.jstl-2.0.0.jarjakarta.servlet.jsp.jstl-api-2.0.0.jar两个jar包手动导入到WEB-INF/lib下,并且一定记得(假设你用的是idea,因为其它的我没用过)对maven项目做这些:

clean->validate->compile->install, 然后rebuild你的module,接着重启tomcat,正常情况下问题是可以解决的。关于问题分析可以翻到下一节

jar包可以通过关注公众号领取

也可以通过官网下载:https://jakarta.ee/zh/specifications/tags/2.0/

在这里插入图片描述

问题3:java.lang.NoClassDefFoundError:jakarta/servlet/jsp/jstl/core/ LoopTag

在这里插入图片描述

假设你使用的Tomcat服务器是10.0及以上,解决方法可以通过以上引入依赖的方式,也可以将jakarta.servlet.jsp.jstl-api-2.0.0.jar这个jar包手动导入到WEB-INF/lib下,并且一定记得(假设你用的是idea,因为其它的我没用过)对maven项目做这些:

clean->validate->compile->install, 然后rebuild你的module,接着重启tomcat,正常情况下问题是可以解决的。关于问题分析可以翻到下一节

问题原因分析

问题一分析:

无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

针对于这个问题,网上给出的大部分解决方法都是下载:jstl-1.2.jarstandard-1.1.2.jar这两个jar包,然后解压取出其中的~文件放到WEB-INF文件夹下,但是这只能解决Tomcat9及以下的服务器。

关于为什么需要解压出tld文件?

因为某些版本的Tomcat在启动中会扫描jar包,但并不会扫描jar包中包含的tld文件,比如c.tld文件等,在tomcat编译过程中被忽略了。

通过查阅我才知道下面这件事

众所周知,由于Tomcat10使用的是JakartaEE9的标准,Servlet的标准包不再由Apache支持维护,转交给Jakarta管理,对应的最新JSTL只能在Jakarta.ee官网下载。

所以,对于Tomcat10原来的jstl-1.2.jar,已经不能满足了,换成了jakarta.servlet.jsp.jstl-2.0.0.jarjakarta.servlet.jsp.jstl-api-2.0.0.jar

问题二分析:

java.lang.NoClassDefFoundError:javax/servlet/jsp/tagext/TagLibraryValidator

我遇到这个错误,是我将jstl-1.2.jar已经导入到项目中,并且我还将c.tld文件导入了WEB-INF中,说明还是少类文件(但是我并没有找到这个类文件。。。)。

然后我新增了pom.xmljstl-2.0的依赖,问题就解决了

问题三分析:

java.lang.NoClassDefFoundError:jakarta/servlet/jsp/jstl/core/LoopTag

也就是编译时找不到LoopTag类,我遇到这个情况是:我已经将jakarta.servlet.jsp.jstl-2.0.0.jar导入了,但是少了另一个包,后来我终于在jstl-api文件下发现了它

在这里插入图片描述

总结

debug的过程中,少不了要去看别人的经历,但是有时候耶稣救不了你,还得根据报什么错,自己发现问题,最好是重新建一个工程,通过对比,发现问题。

  • 21
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值