java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > maven项目中Tomcat10与JSTL的问题

解读maven项目中Tomcat10与JSTL的问题汇总(Debug亲身经历)

作者:某猿蚊常叮

这篇文章主要介绍了解读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.jarjakarta.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.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的过程中,少不了要去看别人的经历,但是有时候耶稣救不了你,还得根据报什么错,自己发现问题,最好是重新建一个工程,通过对比,发现问题。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文