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

 更新时间:2023年07月17日 10:09:58   作者:某猿蚊常叮  
这篇文章主要介绍了解读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的过程中,少不了要去看别人的经历,但是有时候耶稣救不了你,还得根据报什么错,自己发现问题,最好是重新建一个工程,通过对比,发现问题。

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

相关文章

  • 深入了解Java线程池:从设计思想到源码解读

    深入了解Java线程池:从设计思想到源码解读

    这篇文章将从设计思想到源码解读,带大家深入了解Java的线程池,文中的示例代码讲解详细,对我们的学习或工作有一定的帮助,需要的可以参考一下
    2021-12-12
  • 从log4j2到Disruptor详解

    从log4j2到Disruptor详解

    这篇文章主要介绍了从log4j2到Disruptor详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 分享40个Java多线程问题小结

    分享40个Java多线程问题小结

    多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级,本文给大家分享40个Java多线程问题小结 的相关资料,需要的朋友可以参考下
    2015-12-12
  • java dom4j解析xml用到的几个方法

    java dom4j解析xml用到的几个方法

    这篇文章主要介绍了java dom4j解析xml用到的几个方法,有需要的朋友可以参考一下
    2013-12-12
  • Java项目中防止SQL注入的四种方案总结

    Java项目中防止SQL注入的四种方案总结

    SQL注入是一种代码注入技术,通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,下面我们就来看看如何在项目中防止SQL注入吧
    2023-10-10
  • SpringMVC全局异常处理小结

    SpringMVC全局异常处理小结

    在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护,本文介绍SpringMVC全局异常处理,感兴趣的朋友一起看看吧
    2024-03-03
  • Java 中Json中既有对象又有数组的参数如何转化成对象(推荐)

    Java 中Json中既有对象又有数组的参数如何转化成对象(推荐)

    Gson库是一个功能强大、易于使用的Java序列化/反序列化库,它提供了丰富的API来支持Java对象和JSON之间的转换,这篇文章主要介绍了Java 中Json中既有对象又有数组的参数如何转化成对象,需要的朋友可以参考下
    2024-07-07
  • Java中的Enum枚举使用方法解析

    Java中的Enum枚举使用方法解析

    这篇文章主要介绍了Java中的Enum枚举使用方法解析,枚举是一种数据类型,和int、double、string等类型相似,枚举用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型,需要的朋友可以参考下
    2023-11-11
  • String类下compareTo()与compare()方法比较

    String类下compareTo()与compare()方法比较

    这篇文章主要介绍了String类下compareTo()与compare()方法比较的相关资料,需要的朋友可以参考下
    2017-05-05
  • SpringBoot项目实现短信发送接口开发的实践

    SpringBoot项目实现短信发送接口开发的实践

    本文主要介绍了SpringBoot项目实现短信发送接口开发的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10

最新评论