tomcat正常启动但 SpringMVC 控制器无法启动

这个bug很神奇!!!tomcat能正常启动但是在浏览器调用后端接口时,你的请求发不到后端,这个bug直接困了我两天时间,直接问AI也没用,他认为是你的springmvc配置文件问题,其实不然,我都已经反复对照了

一、检查一下工件配置

问题是 Java 类文件已经同步到out/artifacts/.../WEB-INF/classes,但 WEB 应用运行依赖的 jar 包(如 servlet-api、SpringMVC 相关 jar)未被复制到out/artifacts/.../WEB-INF/lib,Tomcat 的类加载器就会找不到 Servlet 相关类(比如javax.servlet.http.HttpServlet、org.springframework.web.servlet.DispatcherServlet),最终导致 SpringMVC 无法初始化、控制器无法访问。

你现在的情况是:

✅ WEB-INF/classes 有 Java 编译文件 → 自身类能找到;

❌ WEB-INF/lib 为空 / 缺失关键 jar → Servlet/SpringMVC 核心类找不到。

正常的输出目录结构:

Maven 项目中,依赖 jar 默认存放在本地仓库(如C:\Users\你的用户名\.m2\repository),IDEA 需要通过Artifacts配置,主动把这些依赖 jar 复制到out/artifacts/.../WEB-INF/lib ------ 你的配置中恰好缺失了这一步。

二、解决:

很简单,就是把lib下的jar包放入输出目录即可,然后再重新编译项目

再次启动tomcat时就可以发现out目录下有lib目录了

补充知识点:

out 是 IntelliJ IDEA 专属的编译 / 部署输出目录,target 是 Maven/Gradle 等构建工具的标准构建产物目录。

角色 负责的目录 作用
Maven target/classes 编译src/main/java下的.java 为.class
target/test-classes 编译测试代码
IDEA(Artifacts) out/artifacts/demo8_Web_exploded 构建 Web 部署目录(模拟 Tomcat 的 WebApp 结构),本应自动包含target/classes的类文件

1、out 是 IntelliJ IDEA 为了管理自身编译、部署产物而自动创建的目录,完全属于 IDE 层面,和 Maven/Gradle 等构建工具无关(即使不用构建工具,纯 IDEA 项目也会生成 out)。IDEA 把 out 拆分为两个核心子目录,分别处理 "编译产物" 和 "部署产物":

子目录 作用
out/production/[模块名] 存放 IDEA 原生编译的 .class 文件(对应 src/main/java 下的 Java 源码);测试代码编译后会放到 out/test-production/[模块名]
out/artifacts/ 存放 IDEA 构建的 "工件(Artifact)"------ 比如 Web 项目的 xxx_exploded(解压的 WAR 包,用于 Tomcat 本地部署)、JAR 包等;这是 Tomcat 在 IDEA 中启动时实际加载的部署目录

2、target 是 Maven/Gradle 等构建工具遵循 "约定优于配置" 原则,自动创建的标准构建产物目录 ------ 完全属于构建工具层面,和 IDE 无关(即使不用 IDEA,用命令行 mvn compile 也会生成 target)。构建工具把所有 "构建相关产物" 都集中到 target,是项目编译、打包、测试的 "唯一核心目录":

子目录 作用
target/classes 存放构建工具编译的 .class 文件(对应 src/main/java),是 Maven/Gradle 编译的核心产物;这是 Java Web 项目中 WEB-INF/classes 的 "源目录"
target/test-classes 存放测试代码(src/test/java)编译后的 .class 文件
target/xxx.war mvn package 后生成的 WAR 包(可直接部署到 Tomcat 的 webapps 目录)
target/xxx/ mvn war:exploded 后生成的解压 WAR 包(和 IDEA 的 exploded 工件结构一致)
generated-sources/ 代码生成工具(如 MyBatis Generator)生成的源码
相关推荐
Lhappy嘻嘻7 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
伊玛目的门徒7 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
懒鸟一枚10 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我1234512 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑12 小时前
Sentinel安装
java·后端·微服务
凤凰院凶涛QAQ13 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案14 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅15 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp15 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维