JAVA_HOME必须指向JDK根目录(含javac.exe),因Tomcat启动脚本需调用javac;CATALINA_HOME指向Tomcat解压根目录,CATALINA_BASE通常无需单独配置;servlet-api依赖须与Tomcat版本匹配(9用javax,10+用jakarta),scope必须为provided。

Tomcat 启动失败、IDEA 里跑不起来 Web 项目,八成是环境变量没配对 —— 尤其是 JAVA_HOME 和 CATALINA_HOME 指向错路径、或被系统残留的 JRE 快捷方式劫持。
为什么 JAVA_HOME 必须指向 JDK 根目录,不能是 JRE?
Tomcat 启动脚本(如 startup.bat 或 catalina.sh)内部会调用 java 和 javac。前者运行时可用,后者编译时必需 —— 而 Windows 上常见的 C:\ProgramData\Oracle\Java\javapath 是 JRE 的软链接,里面只有 java.exe,没有 javac.exe。
常见错误现象:
- 双击
startup.bat窗口一闪而过,日志无输出 - 命令行执行
startup.bat报错:'javac' is not recognized as an internal or external command
实操建议:
-
JAVA_HOME值必须是 JDK 安装根路径(例如D:\jdk1.8.0_333),且该路径下bin子目录中必须存在javac.exe -
Path中只保留一条%JAVA_HOME%\bin,并确保它排在最顶部 - 删掉
Path里所有含javapath的条目(哪怕看起来是 Oracle 官方的)
CATALINA_HOME 和 CATALINA_BASE 到底要不要都配?
绝大多数本地开发场景下,CATALINA_BASE 可以不配 —— Tomcat 默认把它当作和 CATALINA_HOME 相同的路径。强行配两个不同路径,反而容易因配置分离导致 conf/server.xml 或 logs 目录找不到。
实操建议:
- 只配
CATALINA_HOME(值为 Tomcat 解压后的根目录,如D:\apache-tomcat-9.0.115) -
Path中追加%CATALINA_HOME%\bin,方便命令行直接调用startup.bat/shutdown.bat - 如果要用 IDEA 多实例调试(比如同时跑两个不同端口的 Tomcat),再考虑单独设
CATALINA_BASE,指向独立配置副本
Maven 依赖里 servlet-api 总报冲突?检查 Tomcat 版本和依赖 scope
Tomcat 9 使用的是 javax.servlet 包,而 Tomcat 10+ 已全面升级为 jakarta.servlet。如果你用的是 Tomcat 9,但 pom.xml 里写了 jakarta.servlet-api,编译能过,运行时一定 NoClassDefFoundError。
常见错误现象:
- Maven 编译成功,但部署到 Tomcat 后访问 404 或 500
- 日志里出现
java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
实操建议:
- 确认 Tomcat 版本:打开
bin/version.bat(Windows)或bin/version.sh(Linux/macOS) - Tomcat 9.x → 依赖写:
<artifactId>servlet-api</artifactId>,<scope>provided</scope> - Tomcat 10.x → 依赖写:
<artifactId>jakarta.servlet-api</artifactId>,<scope>provided</scope> -
provided是关键:告诉 Maven 这个包由容器(Tomcat)提供,打包时不要打进WEB-INF/lib
IDEA 里 Tomcat 启动后页面空白或 404?优先查 artifacts 配置
IDEA 不像 Eclipse 那样自动把 Maven 项目识别为 Web 应用。即使 pom.xml 有 war 打包类型,IDEA 仍需手动配置 Deployment Artifacts,否则它根本不会把 webapp 目录和编译后的 class 放进 Tomcat 的 webapps 下。
实操建议:
- 打开
Run → Edit Configurations… → Tomcat Server → Deployment - 点击
+→Artifact→ 选择你项目的xxx:war exploded - 确认
Application context是/或你想要的路径(比如/myapp) - 别漏掉
Before launch里的Build artifact,否则改了代码也不会热更新
真正容易被忽略的点:Tomcat 的 conf/web.xml 里默认启用了 default servlet 和 jsp servlet,但如果你用的是较新版本的 IDEA + Maven + Tomcat 9,且项目没显式配置 web.xml,IDEA 有时会跳过初始化 —— 此时哪怕 Artifact 配对了,也看不到页面。最稳的办法是,在 src/main/webapp/WEB-INF/web.xml 里补一个最小化声明(哪怕只有一行 <web-app></web-app>),强制触发容器加载逻辑。


















