Tomcat项目404,报WARNING:org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads

本文记录了阿里云服务器续费后,Tomcat启动出现404错误的问题排查过程。问题根源在于MySQL服务未启动,通过service mysqld start命令解决了这一问题。

前些日子买的阿里云服务器到期了,服务器停机几天后续费,重启tomcat时报错:

07-Aug-2019 16:56:41.056 WARNING [Catalina-utility-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [EnglishClub] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.lang.Object.wait(Native Method)
 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
 com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:70)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 java.lang.Thread.run(Thread.java:748)

刚开始也没咋注意,认为就一个WARNING,又不是ERROR,但不曾想tomcat启动后项目一直404。

疯狂debug后发现,问题在它:

 com.mysql.cj.jdbc.A

08-Sep-2025 13:35:44.453 SEVERE [http-nio-8080-exec-15] org.apache.catalina.core.StandardContext.startInternal Context [/mesFERROTEC] startup failed due to previous errors 08-Sep-2025 13:35:44.976 WARNING [http-nio-8080-exec-15] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [mesFERROTEC] registered the JDBC driver [com.mysql.cj.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 08-Sep-2025 13:35:44.978 WARNING [http-nio-8080-exec-15] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [mesFERROTEC] appears to have started a thread named [mysql-cj-abandoned-connection-cleanup] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144) com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:85) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) java.lang.Thread.run(Thread.java:748) 08-Sep-2025 13:35:44.979 WARNING [http-nio-8080-exec-15] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [mesFERROTEC] appears to have started a thread named [pool-21-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: sun.misc.Unsafe.park(Native Method) java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) java.lang.Thread.run(Thread.java:748) 08-Sep-2025 13:35:44.986 INFO [http-nio-8080-exec-15] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/mesFERROTEC.war] has finished in [109,199] ms 08-Sep-2025 13:35:47.008 INFO [mysql-cj-abandoned-connection-cleanup] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load []. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access. java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load []. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access. at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1378) at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1030) at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader(AbandonedConnectionCleanupThread.java:117) at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:84) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
09-09
01-Jul-2025 18:26:22.896 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [/ecm-sf5-cn] startup failed due to previous errors 01-Jul-2025 18:26:22.968 WARNING [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ecm-sf5-cn] appears to have started a thread named [Catalina-utility-2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:4825) org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1172) org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1176) org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1176) org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1154) java.base@17.0.12/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) java.base@17.0.12/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) java.base@17.0.12/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) java.base@17.0.12/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) java.base@17.0.12/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) java.base@17.0.12/java.lang.Thread.run(Thread.java:840) 01-Jul-2025 18:26:22.968 WARNING [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ecm-sf5-cn] appears to have started a thread named [DefaultQuartzScheduler_QuartzSchedulerThread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.base@17.0.12/java.lang.Object.wait(Native Method) org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:427) 01-Jul-2025 18:26:22.977 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ecm-sf5-cn] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@3777677a]) and a value of type [com.documentum.web.env.app.AppServerEnvironment] (value [[Name = App Server Environment, Description = App Server Environment Implementation, Major Version = 0, Minor Version = 1, Author = Documentum, Portal Description = App Server, Portal Version = x.x, Environment Base Version = 1.0, Environment Service Version = 6.0, Supports Dispatch Contract = true, Supports Theme Contract = true, Supports Error Contract = true, Supports FormOperationListener Contract = false, Supports Locale Contract = true, Supports Session Contract = true, Supports Tag Contract = false, Supports Render Contract = true, Supports Login Contract = false, Supports Security Contract = true, Supports ActionPrecondition Contract = false, Supports MessageService Contract = false, Supports SuperCredentials Contract = true, Supports Preference Contract = true, Supports ContentTransfer Contract = true]]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak. [2025-07-01 06:26:22,998] Artifact ecm-sf5-cn: Error during artifact deployment. See server log for details.
07-02
HTTP状态 500 - 内部服务器错误 类型 异常告 消息 java.lang.NoClassDefFoundError: jakarta/servlet/jsp/tagext/TagLibraryValidator 描述 服务器遇到一个意外的情况,阻止它完成请求。 例外情况 javax.servlet.ServletException: java.lang.NoClassDefFoundError: jakarta/servlet/jsp/tagext/TagLibraryValidator org.apache.jasper.servlet.JspServlet.service(JspServlet.java:305) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 根本原因。 java.lang.NoClassDefFoundError: jakarta/servlet/jsp/tagext/TagLibraryValidator java.base/java.lang.ClassLoader.defineClass1(Native Method) java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2342) org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2212) org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:821) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1312) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1160) java.base/java.lang.ClassLoader.defineClass1(Native Method) java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2342) org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2212) org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:821) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1312) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1160) org.apache.jasper.compiler.TagLibraryInfoImpl.createValidator(TagLibrary
最新发布
10-27
<think>我们正在解决一个HTTP状态500内部服务器错误,具体异常是:java.lang.NoClassDefFoundError: jakarta/servlet/jsp/tagext/TagLibraryValidator。 根据引用[2][3][4][5]的信息,这个错误通常与JSTL(JSP标准标签库)的使用有关,特别是在Tomcat 10及以上版本中,因为Tomcat 10将包名从javax.servlet更改为jakarta.servlet。 引用[2]指出:Tomcat10.0使用了jakarta.*包而不是javax.*包,因此传统的javax.servlet的JSTL包无法使用,需要替换为jakarta.servlet的JSTL包。 引用[3]提到:tomcat10中的javax.servlet-api已经变成jakarta.servlet-api,导致依赖不匹配。 引用[4]和[5]给出了解决方法:更换JSTL的jar包为适用于jakarta的版本。 因此,解决这个问题的关键步骤是: 1. 确认使用的Tomcat版本(如果是Tomcat 10+)。 2. 更换JSTL相关的jar包为适用于jakarta的版本。 具体步骤: 步骤1:检查Tomcat版本 确保使用的是Tomcat 10或更高版本。如果不是,则可能是其他原因,但根据错误信息,大概率是版本问题。 步骤2:移除旧的javax.servlet的JSTL jar包 从项目WEB-INF/lib目录中移除旧的JSTL jar包,例如jstl.jar和standard.jar(或者类似名称的包)。 步骤3:添加适用于jakarta的JSTL jar包 需要添加以下两个jar包(具体版本号可以选择更新的,但需要匹配): - jakarta.servlet.jsp.jstl-api-2.0.0.jar - jakarta.servlet.jsp.jstl-2.0.0.jar 或者,如果使用Maven,可以在pom.xml中添加依赖: ```xml <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency> ``` 步骤4:修改JSP页面中的taglib声明 在JSP页面中,将原来的: <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> 改为: <%@ taglib uri="https://jakarta.ee/xml/ns/jakartaee/jstl/core" prefix="c" %> 注意:根据JSTL版本,URI可能有变化,确保使用正确的URI。 步骤5:清理和重新部署 清理项目(如清除编译输出、清理Tomcat工作目录)并重新部署项目。 引用[5]提到,错误发生在添加JSTL标签库引用时,所以确保标签库的URI和jar包匹配非常重要。 如果以上步骤不能解决问题,可能需要检查其他依赖是否也使用了javax.servlet,如果有,需要将它们也升级到支持jakarta的版本。 总结:这个错误主要是由于Tomcat 10及以上版本中包名更改导致的,我们需要使用对应的jakarta版本的JSTL库。 相关问题: 1. 如何确认Tomcat的版本? 2. 除了JSTL,还有哪些依赖可能会因为Tomcat 10的包名更改而出现问题? 3. 如果项目中同时存在javax和jakarta的依赖,应该如何解决冲突? </think>### 解决 HTTP 500 错误:`java.lang.NoClassDefFoundError: jakarta/servlet/jsp/tagext/TagLibraryValidator` 这个错误是由于 **Tomcat 10+ 的包名变更**导致的。Tomcat 10 将原有的 `javax.servlet` 包迁移到 `jakarta.servlet`,但项目中仍在使用旧版 `javax.*` 的 JSTL 库。以下是解决步骤: #### ✅ 解决方法 1. **移除旧版 JSTL 依赖** - 删除项目中所有 `javax.servlet` 相关的 JSTL 包(如 `jstl.jar`, `standard.jar`)。 2. **添加 Jakarta 兼容的 JSTL 包** - **手动下载**: - [jakarta.servlet.jsp.jstl-2.0.0.jar](https://repo1.maven.org/maven2/org/glassfish/web/jakarta.servlet.jsp.jstl/2.0.0/) - [jakarta.servlet.jsp.jstl-api-2.0.0.jar](https://repo1.maven.org/maven2/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api/2.0.0/) - **Maven 依赖**(推荐): ```xml <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency> ``` 3. **更新 JSP 标签库声明** - 将 JSP 文件中的旧声明: ```jsp <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> ``` 替换为 **Jakarta 兼容的 URI**: ```jsp <%@ taglib uri="https://jakarta.ee/xml/ns/jakartaee/jstl/core" prefix="c" %> ``` 4. **清理并重新部署** - 清理 Tomcat 的 `work` 目录(缓存文件); - 重启 Tomcat 服务器。 #### ⚠️ 注意事项 - **Tomcat 版本**:仅 Tomcat 10+ 需要此调整(Tomcat 9 及以下仍用 `javax.*`)[^2][^3]。 - **依赖冲突**:检查其他依赖(如 `servlet-api`)是否兼容 Jakarta。若存在 `javax.*` 依赖,需同步替换为 Jakarta 版本。 #### 🌰 示例配置(Maven) ```xml <dependencies> <!-- Jakarta Servlet API(Tomcat 10+ 必须) --> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <!-- Jakarta JSTL --> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency> </dependencies> ``` > **根本原因**:Tomcat 10 将 Java EE 迁移至 Jakarta EE,包路径从 `javax.*` 改为 `jakarta.*`,导致旧版 JSTL 库失效[^2][^3][^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

请保持优秀。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值