下载Tomcat须选tar.gz或zip二进制包,避免exe安装版;解压后确保bin、conf、webapps目录完整;JAVA_HOME和CATALINA_HOME需设为无中文无空格的绝对路径;端口冲突时优先修改server.xml中Connector port;部署应用须用WAR包或标准目录结构,注意JDK 11+与jakarta.servlet兼容性。

下载Tomcat时认准 tar.gz 或 zip 二进制包,别下 exe 安装版
Windows 上双击 apache-tomcat-10.1.x-windows-x64.exe 看似省事,但会把路径硬编码进注册表和服务配置里,后续改端口、换 JDK、迁移项目都容易出 java.lang.ClassNotFoundException 或服务启动失败。直接去 官网下载页 找 Core 下的 zip(Windows)或 tar.gz(macOS/Linux)更可控。
解压后目录结构必须包含:bin(含 startup.bat/startup.sh)、conf(含 server.xml)、webapps。如果解压出来多了一层文件夹(比如 apache-tomcat-10.1.22/ 套着另一个同名文件夹),手动剪切内容到干净路径,避免 CATALINA_HOME 指向错误。
JAVA_HOME 和 CATALINA_HOME 必须设为绝对路径,且不能带中文或空格
Tomcat 启动脚本依赖这两个环境变量定位 JDK 和自身根目录。常见翻车点:
-
JAVA_HOME指向 JRE 而非 JDK(报错:'The JAVA_HOME environment variable is not defined correctly') -
CATALINA_HOME设成D:\Program Files\apache-tomcat-10.1.22—— 空格导致startup.bat解析失败,静默退出 - 在 Windows 上用 PowerShell 设置了变量,但用 CMD 运行
startup.bat—— 两个终端环境变量不互通
验证方式:CMD 中执行 echo %JAVA_HOME% 和 echo %CATALINA_HOME%,确认输出是类似 C:\jdk-17.0.2 和 D:\tomcat 的纯英文无空格路径;再执行 %CATALINA_HOME%\bin\version.bat,能看到 Java 版本和 Tomcat 版本即成功。
立即学习“Java免费学习笔记(深入)”;
修改 server.xml 前先备份,端口冲突时优先调 connector port 而非 shutdown port
默认 8080 端口常被其他程序(如 Skype、另一份 Tomcat)占用,启动时日志出现 'Address already in use' 就得改。打开 %CATALINA_HOME%\conf\server.xml,重点改这一行:
把 port="8080" 改成 port="8081" 即可。不建议动 shutdown port="8005" —— 这个端口只用于本地发 shutdown 命令,改它反而可能导致 shutdown.bat 失效。改完保存,重启 Tomcat,访问 http://localhost:8081 应看到猫猫图标页面。
注意:如果用 IDE(如 IntelliJ)集成 Tomcat,IDE 内部配置的端口和 server.xml 必须一致,否则运行时显示页面但控制台报错 Connection refused。
部署 Web 应用时,别把整个 IDEA 项目文件夹扔进 webapps
Tomcat 只识别符合 Servlet 规范的结构。正确做法是:
- 用 Maven 构建出
target/your-app.war,直接丢进webapps/目录(Tomcat 会自动解压) - 或手动生成目录结构:
webapps/myapp/WEB-INF/web.xml+webapps/myapp/WEB-INF/classes/+webapps/myapp/WEB-INF/lib/ - 别把 IDEA 的
src、pom.xml、.idea文件夹一起复制进去 —— Tomcat 不认识这些,还会因web.xml缺失报Failed to start component
首次部署后,检查 logs/catalina.out(Linux/macOS)或 logs/catalina.date.log(Windows),搜索 INFO: Starting ProtocolHandler 和 deployed with context path [/myapp] 确认成功。如果只看到 Deployment of web application directory 但没后续日志,大概率是 web.xml 格式错误或 Servlet 类没编译进 classes。
最易忽略的是 JDK 版本与 Tomcat 版本匹配问题:Tomcat 10+ 要求 JDK 11+,且 Servlet API 已从 javax.* 迁移到 jakarta.* —— 如果你用老教程抄 import javax.servlet.*,编译能过,运行时必抛 NoClassDefFoundError。










