解读maven项目中Tomcat10与JSTL的问题汇总(Debug亲身经历)
作者:某猿蚊常叮
maven项目中Tomcat10与JSTL的问题汇总
如果你在学习 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.jar
和jakarta.servlet.jsp.jstl-api-2.0.0.jar
两个jar包手动导入到WEB-INF/lib
下,并且一定记得(假设你用的是idea
,因为其它的我没用过)对maven
项目做这些:
clean->validate->compile->install, 然后rebuild你的module,接着重启tomcat,正常情况下问题是可以解决的。关于问题分析可以翻到下一节
也可以通过官网下载: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.jar
和standard-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.jar
和jakarta.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.xml
中jstl-2.0
的依赖,问题就解决了
问题三分析
java.lang.NoClassDefFoundError:jakarta/servlet/jsp/jstl/core/LoopTag
也就是编译时找不到LoopTag类,我遇到这个情况是:
我已经将jakarta.servlet.jsp.jstl-2.0.0.jar
导入了,但是少了另一个包,后来我终于在jstl-api文件下发现了它
总结
debug
的过程中,少不了要去看别人的经历,但是有时候耶稣救不了你,还得根据报什么错,自己发现问题,最好是重新建一个工程,通过对比,发现问题。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。