tomcat默认自动解压部署webapps下war包,但需确保server.xml中host的autodeploy="true"和unpackwars="true"未被禁用,且appbase正确指向webapps;同时须检查jdk版本兼容性、文件权限、war完整性及root.war命名规范。

Tomcat 默认就能自动解压并部署 webapps 目录下的 WAR 包,但“能”不等于“一定成功”——多数部署失败不是因为不会配,而是卡在 JDK 版本、路径权限、包名冲突或配置残留上。
确认 Tomcat 启动时是否真在扫描 webapps
Tomcat 是否自动解压 WAR,取决于 server.xml 中的 Host 配置是否启用自动部署(autoDeploy="true")和后台解压(unpackWARs="true")。默认是开启的,但如果你改过配置,就容易被忽略:
-
autoDeploy="false":即使把 WAR 放进去,Tomcat 启动时也不会处理它 -
unpackWARs="false":WAR 文件会被复制过去,但不会解压成目录,应用也无法访问 -
appBase被误设为其他路径(比如写成appBase="webapp"少了个s),导致 Tomcat 根本不看你的webapps目录
检查方式:打开 $CATALINA_HOME/conf/server.xml,定位到 <host></host> 标签,确认它类似这样:
<host name="localhost" appbase="webapps" unpackwars="true" autodeploy="true"></host>
war 包放对位置但没解压?先看日志和文件状态
不是所有“没解压”都是配置问题。常见真实原因包括:
-
webapps目录下已存在同名解压后的文件夹(比如你放了myapp.war,又手动建了myapp/目录),Tomcat 会跳过解压,认为“已有最新内容” -
webapps权限不足(Linux/macOS 下尤其常见),Tomcat 进程无法写入或创建子目录 - WAR 包本身损坏或未完整上传(比如用 FTP 传了一半就断了),Tomcat 解压校验失败后静默跳过
- 日志里其实有报错,但你只看了控制台输出,没查
$CATALINA_HOME/logs/catalina.out或localhost.<date>.log</date>
实操建议:启动前删掉 webapps/myapp*(包括 .war 和同名目录),再放新 WAR;启动后立刻查 catalina.out,搜索 myapp 或 deploy 关键字。
ROOT.war 和路径 / 的区别必须分清
想让项目直接通过 http://localhost:8080/ 访问,不能靠改 context path,而是要把 WAR 包重命名为 ROOT.war(全大写,无版本号,无点号)。Tomcat 对这个名字有硬编码识别逻辑:
-
ROOT.war→ 解压为ROOT/→ 绑定到根路径/ -
myapp.war→ 解压为myapp/→ 访问路径是/myapp/,不是/ -
myapp-1.0.war→ 解压为myapp-1.0/→ 访问路径是/myapp-1.0/,前端资源里的/css/app.css会 404,除非你用相对路径或配置context.xml
注意:ROOT 是唯一特殊名字,其他任何命名(包括 root.war 小写)都不会生效。
JDK 版本不匹配会导致 war 根本加载失败
Tomcat 启动成功 ≠ WAR 能部署。如果 WAR 是用 JDK 17 编译的,而你运行的是 Tomcat 9(只支持 JDK 8),那 Tomcat 可能连类都加载不了,日志里出现 UnsupportedClassVersionError 或一堆 NoClassDefFoundError,但 WAR 文件还在那儿“静静躺着”,看起来像没解压。
- 查清楚你用的 Tomcat 主版本(如 10.1.x、11.0.x),对照它的最低 JDK 要求(2026 年主流是 JDK 11 或 17)
- 运行
java -version确认实际环境 JDK 版本,不是看JAVA_HOME路径名(比如路径里写着 jdk-17,但实际指向的是旧版本软链) - Spring Boot 项目尤其要注意:Tomcat 10+ 使用
jakarta.servlet,老项目若没升级依赖,打包成 WAR 后一部署就报javax/servlet/HttpServlet找不到
真正麻烦的不是“怎么配”,而是错误发生在哪一层:是文件没放对?权限不够?配置关了?JDK 不兼容?还是 WAR 本身带了不兼容的 API?每层都要单独验证,不能只盯着一个地方反复试。











