Tomcat 引入jar包导致的 NoClassDefFoundError 报错的问题解决

问题处理

今天在慕课网上学习时用到了一个问题:在 Tomcat 下跑项目时 new SAXreader(); 方法不执行。项目运行到 SAXReader reader = new SAXReader(); 时直接跳出整个方法,没有执行后面的代码,且控制台没有报错信息。

我使用 Maven 构建项目,pom 文件中的确引入了相关依赖,而且是目前最新的版本,不存在版本不兼容问题。

	<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
	<dependency>
	    <groupId>dom4j</groupId>
	    <artifactId>dom4j</artifactId>
	    <version>1.6.1</version>
	</dependency>

我在课程下方的评论处也看见有人遇到了同样的问题(原问题链接),然而并没有人回答。我在 Google,Stack Overflow 也没有找到有效的解决方法。


后来我突然想到以前手动引入 jar 包时常发生的一个问题,就是Tomcat 启动时默认在安装目录下的 lib 文件夹下寻找 jar 包,可能你将 jar 包下载到了项目目录下,而 Tomcat 的目录下没有该 jar 包,那么程序可以编译成功,但运行时就抛出 ClassNotFound 的异常。

于是我去看了下 Tomcat 下的 lib 目录,里面果然没有 dom4j 的相关 jar 包,Maven 默认将 jar 包下载到了 user 下的 .m2/repository 文件夹中,于是我把 jar 包复制过去,方法即可运行。

然而出现另外一个错误,发现 XStream 方法也出现了同样的问题,于是我把 xstream.jar 和 xmlpull.jar (XStream 依赖的 jar 包)也复制了过去,结果程序运行成功。


遗留的问题

Maven 所下载的 jar 包是否可以通过配置自动复制到 Tomcat 目录下,或者 Tomcat 启动时是否可以增加搜索 jar 包的位置,每次都手动的复制会造成许多不方便。

<think>好的,我现在需要解决用户的问题:在Tomcat9中出现java.lang.NoClassDefFoundError,具体是jakarta.servlet.jsp.jstl.core.ConditionalTagSupport缺失。用户之前提供的引用资料中提到Tomcat10和Tomcat9可能涉及不同的路径,比如Jakarta EE和之前的javax。首先,我得确认Tomcat9使用的是哪个命名空间。 Tomcat9应该还是使用javax.servlet的结构,而Tomcat10开始迁移到Jakarta EE 9,名改为jakarta.servlet。所以用户可能在Tomcat9中错误地使用了Jakarta EE的JSTL库,导致类找不到。根据引用[4]提到的解决方案,需要正确下载并放入对应的jarTomcat的lib目录。但这里要注意Tomcat版本对应的是否正确。 用户的问题中提到错误是jakarta.servlet...,而Tomcat9本来应该用javax.servlet,这说明可能存在版本不匹配。可能用户下载了Jakarta EE版本的JSTL(比如jakarta-taglibs-standard),而Tomcat9需要的是旧的javax版本。因此,正确的做法应该是获取适用于Tomcat9的JSTL库,也就是javax的版本,比如从旧的JSTL实现如taglibs-standard-impl-1.2.5.jar和taglibs-standard-spec-1.2.5.jar,或者引用[4]提到的jakarta-taglibs-standard可能不适用于Tomcat9,因为jakarta的名在Tomcat10才支持。 所以解决方案应该是:下载适用于Tomcat9的JSTL库,即基于javax的,放入WEB-INF/lib或Tomcat的lib目录。同时检查项目的依赖,确保没有引入Jakarta EE的库,导致冲突。可能用户错误地导入了jakarta的,而Tomcat9无法识别,从而引发类找不到的错误。 另外,引用[3]和[4]提到需要放入jstl和standard的jar,但要注意版本兼容性。用户需要确认下载的jar是否匹配Tomcat9的Servlet/JSP API版本。例如,使用Apache Taglibs的Standard 1.2.x版本,这些是支持javax的。 总结步骤:1. 确认Tomcat9使用javax,而非jakarta;2. 下载对应JSTL的javax版本;3. 将jar放入正确的位置;4. 检查项目依赖,排除冲突的Jakarta。同时需要指导用户如何正确获取这些jar,比如从Maven仓库或Apache官网下载正确的版本。</think>### Tomcat9出现java.lang.NoClassDefFoundError: jakarta.servlet.jsp.jstl.core.ConditionalTagSupport 解决方案 #### 问题原因分析 此错误表明Tomcat9运行时无法找到JSTL(JavaServer Pages Standard Tag Library)的核心类`ConditionalTagSupport`。**根本原因是路径命名空间冲突**: 1. Tomcat9及以下版本使用`javax.servlet`命名空间,而Tomcat10及以上版本迁移到`jakarta.servlet`命名空间[^4]。 2. 如果项目中错误引入了Jakarta EE 9+版本的JSTL库(如`jakarta.servlet.jsp.jstl`),会导致类加载失败。 #### 解决步骤 1. **确认JSTL版本兼容性** 下载适用于Tomcat9的JSTL实现库(基于`javax`命名空间): - 官方推荐:Apache Taglibs Standard 1.2.x Maven依赖: ```xml <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> </dependency> ``` - 手动下载地址:[Apache Taglibs Standard 1.2.5](https://tomcat.apache.org/taglibs/standard/) 2. **部署JAR文件** - 将下载的`taglibs-standard-impl-1.2.5.jar`和`taglibs-standard-spec-1.2.5.jar`复制到以下位置: - **项目内**:`WEB-INF/lib`目录(推荐,避免影响其他项目) - **全局**:Tomcat的`lib`目录(`${TOMCAT_HOME}/lib`) 3. **清理冲突依赖** 检查项目是否误引入Jakarta EE版本的JSTL库(如`jakarta.servlet.jsp.jstl`),并在构建工具(如Maven/Gradle)中排除: ```xml <!-- Maven示例:排除冲突依赖 --> <dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>3.0.0</version> <exclusions> <exclusion> <groupId>jakarta.servlet</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> ``` 4. **重启Tomcat并验证** ```bash ${TOMCAT_HOME}/bin/shutdown.sh # 停止Tomcat ${TOMCAT_HOME}/bin/startup.sh # 启动Tomcat ``` #### 补充说明 - 如果使用JSP页面,需在页面头部声明正确的标签库: ```jsp <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> ``` - 避免混合使用`javax`和`jakarta`命名空间的库,否则可能引发`ClassNotFoundException`[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隐秀_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值