Tomcat10运行springMVC项目浏览器访问出现java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet错误解决方法

Tomcat10运行SpringMVC项目报HttpServlet错误解决方案
在运行SpringMVC项目时,遇到Tomcat10浏览器访问报java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet错误。问题源于Tomcat10将javax.* API改为jakarta.*。解决方案包括降级Tomcat服务器至9版本,或者修改项目依赖,将javax下的依赖替换为jakarta.*的相应依赖。通过这些调整,可以成功解决此问题。

1.问题描述

今天复习springMVC知识点时,写了一个简单的SpringMVC项目练练手,但是在Tomcat10运行时控制台没报错,浏览器出现java.lang.NoClassDefFoundError:javax/servlet/http/HttpServlet错误(如图1所示)

在这里插入图片描述

图1

2.问题分析

出现了上述错误后,开始怀疑是代码出现问题,检查确认代码没有问题后将问题定位在tomcat服务器或项目依赖,在网上查阅一番发现不少同学出现了相同问题,问题关键就是tomcat10服务器,tomcat10将所有已经实现的API已经从 javax.到jakarta.(如图2所示)
在这里插入图片描述

图2

3.问题解决

出现上述问题解决方法有以下两种:

3.1降低tomcat服务器版本,tomcat9替换tomcat10

因为tomcat10将所有已经实现的API已经从 javax.*到jakarta.*如果我们就是要用javax包下的接口或类只能降低tomcat版本

3.2修改项目的依赖

将mave依赖中的javax下的依赖

  		<dependency>
            <groupId>javax.servlet</grou
严重: 启动过滤器异常[characterEncodingFilter] java.lang.NoClassDefFoundError: javax/servlet/Filter at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1023) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2161) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:695) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1183) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1053) at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1023) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2161) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:695) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1183) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1053) at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1023) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2161) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:695) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1183) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1053) at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:480) at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:463) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:139) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:221) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:95) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3868) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4470) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1170) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1160) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:716) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:771) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1170) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1160) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:716) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:203) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:415) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:866) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164) at org.apache.catalina.startup.Catalina.start(Catalina.java:759) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:470) Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1222) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1053) ... 54 more 5月 10, 2025 2:24:18 下午 org.apache.catalina.core.StandardContext startInternal 严重: 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到 5月 10, 2025 2:24:18 下午 org.apache.catalina.core.StandardContext startInternal 严重: 由于之前的错误,Context[/productms]启动失败 5月 10, 2025 2:24:18 下午 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads 警告: Web应用程序[productms]似乎启动了一个名为[mysql-cj-abandoned-connection-cleanup]的线程,但未能停止它。这很可能会造成内存泄漏。线程的堆栈跟踪:[ java.base/java.io.WinNTFileSystem.getBooleanAttributes0(Native Method) java.base/java.io.WinNTFileSystem.getBooleanAttributes(WinNTFileSystem.java:512) java.base/java.io.FileSystem.hasBooleanAttributes(FileSystem.java:125) java.base/java.io.File.isFile(File.java:900) org.apache.catalina.webresources.AbstractFileResourceSet.file(AbstractFileResourceSet.java:69) org.apache.catalina.webresources.DirResourceSet.getResource(DirResourceSet.java:115) org.apache.catalina.webresources.StandardRoot.getResourceInternal(StandardRoot.java:273) org.apache.catalina.webresources.CachedResource.validateResource(CachedResource.java:107) org.apache.catalina.webresources.Cache.getResource(Cache.java:96) org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:212) org.apache.catalina.webresources.StandardRoot.getClassLoaderResource(StandardRoot.java:221) org.apache.catalina.loader.WebappClassLoaderBase.findResource(WebappClassLoaderBase.java:762) org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:876) com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader(AbandonedConnectionCleanupThread.java:123) com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:90) java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) java.base/java.lang.Thread.run(Thread.java:1570)] 5月 10, 2025 2:24:20 下午 org.apache.jasper.servlet.TldScanner scanJars 信息: 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 5月 10, 2025 2:24:20 下午 org.apache.jasper.servlet.TldScanner scanJars 信息: 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 5月 10, 2025 2:24:21 下午 org.apache.jasper.servlet.TldScanner scanJars 信息: 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 5月 10, 2025 2:24:22 下午 org.apache.jasper.servlet.TldScanner scanJars 信息: 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 5月 10, 2025 2:24:23 下午 org.apache.jasper.servlet.TldScanner scanJars 信息: 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 5月 10, 2025 2:24:23 下午 org.apache.catalina.loader.WebappClassLoaderBase checkStateForResourceLoading 信息: 非法访问:此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。 java.lang.IllegalStateException: 非法访问:此Web应用程序实例已停止。无法加载[]。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。 at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1242) at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:855) at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.checkThreadContextClassLoader(AbandonedConnectionCleanupThread.java:123) at com.mysql.cj.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:90) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1570)HTTP状态 404 - 未找到 类型 状态报告 消息 文.件[/productms/WEB-INF/views/product-list.jsp] 未找到 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/11.0.4SpringMVC XML配置文件文件头报错,并且显示Downloading external resources is disabled.
最新发布
05-11
<think>好的,我现在需要解决用户提到的Apache Tomcat 11.0.4和SpringMVC集成时出现的几个问题:404错误NoClassDefFoundError异常、XML配置文件头报错以及外部资源下载被禁用的问题。首先,我应该逐个分析每个问题的可能原因,并参考用户提供的站内引用中的相关信息来寻找解决方案。 首先是NoClassDefFoundError: javax.servlet.Filter。这通常意味着缺少相关的Servlet API依赖。Tomcat 11使用的是Jakarta Servlet 6.0规范,而用户可能在项目错误地引用了旧的javax.servlet包。需要确认项目的依赖是否正确,是否使用了Jakarta的依赖。根据引用[1]中提到的配置资源的问题,可能需要检查依赖配置是否正确,尤其是在Maven的pom.xml文件中是否添加了正确的Servlet API依赖,并且作用域设置为provided。同时,参考引用[3]中的类路径问题,可能需要确保依赖的版本与Tomcat 11兼容。 接下来是404错误。可能的原因包括控制器配置错误、视图解析器未正确设置或URL映射问题。根据引用[4]提到的Servlet初始化错误,检查SpringMVC的配置文件(如web.xml和springmvc-servlet.xml)是否正确,特别是组件扫描的包路径是否正确,控制器是否被正确识别。同时,确保DispatcherServlet的映射路径正确,比如应该映射到/或/*,而不是过于具体的路径。 XML配置文件头报错可能是因为XML命名空间或Schema版本不兼容Tomcat 11和Spring版本。Tomcat 11支持Jakarta EE 10,而Spring可能需要更新到与Jakarta兼容的版本,如Spring 6+。检查springmvc-servlet.xml中的命名空间是否使用正确的Jakarta URL,而不是旧的javax URL。例如,将http://www.springframework.org/schema/beans升级到最新版本,并确认Schema的URL是否正确。 外部资源下载被禁用的问题,用户之前已经询问过,可能需要配置Maven镜像仓库或代理设置,确保依赖能够正确下载。根据引用[1]中的pom.xml资源配置,可能需要调整构建配置,确保资源文件正确打包。同时,检查IDE的代理设置,确保没有网络问题导致依赖下载失败。 还需要检查项目的整体结构,确保src/main/webapp/WEB-INF下有正确的web.xml和Spring配置文件,并且编译后的文件正确部署到Tomcat的webapps目录中。此外,清理项目并重新构建(mvn clean install)可以解决一些资源未正确打包的问题,如引用[1]中提到的clean后再install。 最后,确保使用的Spring版本与Tomcat 11兼容。例如,Spring Framework 6.0及以上版本支持Jakarta EE 10,而旧版Spring可能不兼容,导致类找不到或初始化错误。如果用户使用的是较旧的Spring版本,可能需要升级到兼容的版本,或者降级Tomcat到与Spring兼容的版本,但这可能不是最佳解决方案。 总结下来,解决方案可能包括更新依赖到Jakarta EE 10兼容版本、检查Spring配置、确保资源正确打包、调整XML配置文件头以及配置构建工具和网络设置以解决依赖下载问题。需要分步骤逐一验证每个可能的原因,并参考用户提供的引用中的相关配置进行调整。</think>#### 一、`NoClassDefFoundError: javax.servlet.Filter` 解决方案 **原因分析** Tomcat 11 遵循 Jakarta EE 10 规范,包路径从 `javax.servlet` 改为 `jakarta.servlet`,而旧版 SpringMVC 仍依赖 `javax` 包路径[^1]。 **步骤1:更新依赖至 Jakarta EE 10 兼容版本** 在 `pom.xml` 中配置 Jakarta Servlet API: ```xml <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> ``` **步骤2:检查 Spring 版本兼容性** - 若使用 Spring 5.x,需降级 Tomcat 至 9.x(兼容 Java EE 8) - 推荐升级到 Spring 6.x(原生支持 Jakarta EE 10): ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.1.5</version> </dependency> ``` #### 二、404 错误排查步骤 **原因1:DispatcherServlet 配置错误** 验证 `web.xml` 中 DispatcherServlet 的映射路径: ```xml <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` **原因2:组件扫描未生效** 在 `springmvc-servlet.xml` 中启用注解扫描: ```xml <context:component-scan base-package="com.example.controller"/> <mvc:annotation-driven/> ``` **原因3:视图解析器缺失** 配置 JSP 视图解析器: ```xml <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> ``` #### 三、XML 配置文件头报错修复 **错误示例** ```xml <!-- 旧版Spring 5.x配置头 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> ``` **更新为 Spring 6.x 兼容格式** ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> ``` #### 四、资源打包配置(参考引用[1]) 在 `pom.xml` 添加资源包含规则: ```xml <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> </resources> </build> ``` 执行 `mvn clean install` 强制刷新构建[^1]。 #### 五、验证部署结构 项目目录应满足: ``` src/ ├── main/ │ ├── java/ │ ├── resources/ │ └── webapp/ │ └── WEB-INF/ │ ├── web.xml │ └── springmvc-servlet.xml target/ └── project-name.war ``` #### 六、类加载问题排查(参考引用[2][3]) 1. 使用 `ClassUtils.isPresent("jakarta.servlet.Filter", classLoader)` 验证类是否存在 2. 若出现 `InaccessibleObjectException`,添加 JVM 参数: ```bash --add-opens java.base/java.lang=ALL-UNNAMED ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值