tomcat发布web项目
把war包丢进tomcat的发布webapps目录,然后启动tomcat——就这么简单?发布我见过太多新手在这步栽跟头,因为Tomcat的发布“自动部署”有它自己的脾气。你扔进去一个名为myapp.war的发布文件,它会自动解压成myapp文件夹,发布但要是发布你改过server.xml里的Host配置,或者tomcat正在运行中就去覆盖war包,发布那可能等上半天页面还是发布404。
先说说最稳的发布流程。关闭tomcat(用bin/shutdown.sh或双击shutdown.bat),发布然后把war包复制到webapps目录下,发布再启动tomcat。发布启动日志里看到Deploying web application archive这行字,发布基本就成了一半。发布等几秒,发布浏览器敲http://localhost:8080/myapp,看到你的页面,收工。
但实际工作里没人这么干。开发机上我习惯用conf/Catalina/localhost下放一个XML配置文件,内容就一行:<Context path="/demo" docBase="/opt/projects/demo/target/demo" />。这样改完代码直接跑mvn package,tomcat会自动加载新编译的class文件,不用重启。不过这个做法有个坑——你要是用了Spring Boot的嵌入式tomcat,这套外部tomcat配置就完全不适用了。
还有种情况,tomcat端口被占用。上次我帮同事排查,他项目一直发布不上去,日志里报Port 8080 required by Tomcat v9.0 Server is already in use。他以为是tomcat没启动成功,实际是后台跑着一个残留的java进程。Windows下用netstat -ano | findstr 8080查到PID,任务管理器里杀掉进程,再重新启动就好了。Linux下更简单,fuser -k 8080/tcp直接释放端口。
发布后访问不到,先别急着怀疑tomcat配置。看看你的war包结构对不对。标准web项目在WEB-INF下必须有web.xml(或者用注解配置的Servlet 3.0+项目可以没有)。有个常见错误:把整个项目文件夹直接压缩成zip改后缀为war,里面多了一层目录。tomcat解压后访问/myapp找不到页面,你得访问/myapp/项目内层文件夹/才行。这种问题排查起来最费时间,因为日志根本不报错。
生产环境发布又是另一套逻辑。我一般会先把新war包放到临时目录,然后用curl测试tomcat的manager接口——前提是你配置了manager-gui角色。通过http://localhost:8080/manager/text/deploy?path=/myapp&update=true这个URL上传war包,tomcat会自动解压并热部署,不停机就能更新。但热部署偶尔会内存泄漏,特别是旧版本有未关闭的数据库连接池。所以真正重要的系统,我反而选择凌晨两点停机发布,干净利落。
最后说个容易忽略的细节。tomcat的conf/server.xml里Host标签有个autoDeploy属性,默认是true。开发环境开着方便,生产环境建议改成false,否则你往webapps里丢东西它会自动部署,万一操作失误把错误配置的文件放进去,线上直接挂掉。改成false后,所有部署都得通过manager接口或重启tomcat,可控性会强很多。
发布这事,说白了就是文件拷贝加进程管理。搞懂war包结构、端口占用、部署方式这几个点,基本就够用了。遇到诡异问题,先看tomcat的logs/catalina.out日志,八成能找出原因。

喜欢
讨厌