升级JDK/Tomcat/MySQL后Tomcat启动类加载失败求助
问题排查与解决方案
一、ClassNotFoundException 逐个处理
1. com.mysql.jdbc.Driver
MySQL Connector/J 8.0.x 已废弃com.mysql.jdbc.Driver,改用com.mysql.cj.jdbc.Driver,同时JDBC URL必须指定时区参数,否则会触发时区错误。
检查并更新context.xml中的数据源配置:
<Resource name="jdbc/YourDB" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC" username="root" password="your_pwd" maxTotal="100" maxIdle="30" maxWaitMillis="10000"/>
确保mysql-connector-j-8.0.31.jar放在Tomcat/lib目录下(不要放在项目WEB-INF/lib,避免类加载冲突)。
2. javax.faces.webapp.FacesServlet
Tomcat 9默认不包含JSF实现,需手动添加依赖:
- Maven项目添加以下依赖(scope设为
provided,避免与Tomcat冲突):
<dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-api</artifactId> <version>2.3.14</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-impl</artifactId> <version>2.3.14</version> <scope>provided</scope> </dependency>
- 非Maven项目,下载
jsf-api.jar和jsf-impl.jar放入Tomcat/lib目录。
同时检查web.xml中的FacesServlet配置,确保类名无拼写错误:
<servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping>
3. org.springframework.web.util.Log4jConfigListener
Spring 4.x+(兼容JDK8)中,Log4j 1.x已停止维护,建议切换到Log4j 2或SLF4J+Logback。若需保留Log4j 1.x:
- 确保项目包含
spring-web和log4j依赖,版本需兼容(比如Spring 4.3.30.RELEASE)。 - 检查
web.xml中的监听器配置,确认类路径存在对应jar包:
<listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
若升级到Log4j 2,替换监听器并添加依赖:
<listener> <listener-class>org.springframework.web.util.Log4j2ConfigListener</listener-class> </listener>
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.20.0</version> </dependency>
二、线程内存泄漏警告
Tomcat 9的内存泄漏警告多因旧库未正确释放线程或类加载器冲突导致,处理方案:
- 清理项目
WEB-INF/lib中重复、过时的jar包(比如旧版JDBC驱动、Apache Commons Pool等)。 - 确保所有依赖版本与Tomcat 9、JDK8兼容(如Spring≥4.3.x,Hibernate≥5.2.x)。
- 在
context.xml的数据源配置中添加资源回收参数:
<Resource ... removeAbandonedOnBorrow="true" removeAbandonedTimeout="60" logAbandoned="true"/>
- 自定义线程池需实现
ServletContextListener,在应用销毁时手动关闭线程资源。
三、额外检查项
- 确认Tomcat
conf/catalina.properties中common.loader配置包含所需jar包路径,避免类加载器无法找到类。 - 删除Tomcat
work目录的旧编译缓存,避免类文件冲突。 - Maven项目用
mvn dependency:tree查看依赖树,排除冲突或过时的依赖。
内容的提问来源于stack exchange,提问作者rob
相关产品推荐
相关产品推荐

