把Java项目部署到Tomcat服务器上,核心就三件事:打对包、放对位置、起对服务。绝大多数Java Web项目都是打成WAR包放进Tomcat的webapps目录,然后启动Tomcat自动解压部署,下面按实际工作流程,把每个环节掰开揉碎了讲清楚。
部署前的环境准备:JDK和Tomcat版本先对齐
很多新手上来就部署失败,问题不是项目本身,而是服务器上的JDK和Tomcat版本跟项目不匹配,行业共识是:Tomcat 9及以上版本需要JDK 8或更高版本,Tomcat 10则要求JDK 11起步,而且使用了Jakarta EE命名空间,老项目直接搬上去会报ClassNotFound。
检查服务器上有没有装JDK
在服务器命令行执行:
java -version
如果没装,用包管理器装OpenJDK(以CentOS为例):
yum install -y java-1.8.0-openjdk-devel
装完再执行java -version确认版本号看得到。
下载并解压Tomcat
Tomcat不需要安装,下载压缩包解压就能用,推荐从Apache官网下载稳定版,比如Tomcat 9.0.x,解压后得到一个apache-tomcat-9.0.x目录,里面关键目录就四个:
- bin:启动和关闭脚本
- conf:配置文件,重点改server.xml
- webapps:放WAR包的地方
- logs:看部署报错日志
配置JAVA_HOME环境变量
Tomcat启动脚本依赖JAVA_HOME,编辑/etc/profile加上:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export PATH=$JAVA_HOME/bin:$PATH
然后source /etc/profile让配置生效,再跑一下catalina.sh version验证Tomcat能识别JDK。
java项目部署到tomcat服务器上的几种打包方式对比
不同项目形态选择不同部署方式,先看一张对比表,心里有个底:
| 项目形态 | 打包方式 | 部署路径 | 适用场景 |
|---|---|---|---|
| 传统Servlet/JSP项目 | WAR包 | webapps目录 | 最常用,自动解压部署 |
| Spring Boot内置Tomcat | JAR包 | 任意目录,java -jar运行 | 微服务、独立进程 |
| Spring Boot外置Tomcat | WAR包 | webapps目录 | 需要统一Tomcat管理多个应用 |
| 前后端分离前端静态文件 | 直接扔静态资源 | webapps/ROOT | 纯前端项目托管 |
WAR包部署适合什么场景
如果你用的是SSH框架、SSM、传统JSP项目,那必须走WAR包路线,打包方式在IDEA里很简单:Project Structure -> Artifacts -> 点加号 -> Web Application Archive,然后Build -> Build Artifacts,生成一个.war文件。
Maven项目更方便,直接在pom.xml里声明:
<packaging>war</packaging>
然后在项目根目录执行:
mvn clean package
target目录下就会产出.war包。
JAR包和WAR包到底选哪个
很多人纠结tomcat部署java war包和jar包的区别,其实本质是一个用外置Tomcat,一个用内置Tomcat,Spring Boot项目默认打成JAR包,用java -jar app.jar就能跑,不需要装Tomcat,但如果公司运维有统一Tomcat管理规范,就改成WAR包丢进webapps。
判断标准:项目里有src/main/webapp目录且配置了JSP,就用WAR;纯接口服务、没有页面视图,直接用JAR更省事。
一键部署工具能不能用
有的团队用IDEA的Tomcat插件直接远程部署,或者用Jenkins自动化发布,这些工具本质还是把WAR传到webapps目录再触发重启,原理没变化,新手不建议一上来就搞自动化,先手动部署成功一次,才能理解整个流程。
手动部署WAR包到Tomcat的完整步骤
这是java项目部署到tomcat服务器上的步骤里最核心的部分,跟着一步步做就行。
第一步:把WAR包传到服务器
用scp命令从本地传:
scp target/myproject.war root@服务器IP:/usr/local/tomcat/webapps/
Windows环境可以用WinSCP或者Xftp拖过去,路径以实际解压目录为准。
第二步:启动Tomcat
进入bin目录,执行:
./startup.sh
启动后去logs/catalina.out日志里看有没有Deployment of web application archive字样,出现Server startup in [xxx] milliseconds就说明部署成功。
第三步:浏览器验证访问
访问地址就是http://服务器IP:8080/项目名/,如果端口不是8080,去conf/server.xml里改Connector的port属性,改完重启生效。
第四步:遇到404或500怎么排查
顺序排查法,别瞎猜:
- 看logs/localhost.log有没有异常堆栈
- 确认WAR包解压出来的目录名跟访问路径一致
- 检查项目里context-path配置,Spring Boot项目可在application.properties里配
- 看端口是否被防火墙挡住,执行
firewall-cmd --list-ports检查,或者直接简米云ECS安全组放行8080
服务器上跑多个Java项目怎么互不干扰
一个Tomcat默认只能跑一个应用占用固定端口,如果公司服务器资源有限,同一个Tomcat想部署多个WAR包?直接往webapps扔就行,Tomcat自动按WAR包名区分上下文路径,比如两个包分别是a.war和b.war,访问路径就是/a和/b,互不影响。
想用80端口或者隐藏项目名怎么办
默认8080端口在公网访问不太友好,把server.xml里Connector的port改成80,再把WAR包改名为ROOT.war,访问时就不用输项目名了,直接http://IP/,改端口前确认80端口没被Nginx或Apache占用。
多个域名映射到同一个Tomcat的不同应用
这是生产环境常见的多项目部署需求,在server.xml的Host节点里配置多个Context:
<Host name="localhost">
<Context path="" docBase="/opt/app1" reloadable="false"/>
</Host>
想加第二个域名就再建一个Host,配上专属appBase和Context,这种方式对运维人员是最常用的tomcat多项目部署方案之一。
与Nginx配合部署需要注意什么
Java项目部署到tomcat服务器上之后,一般不会直接让用户访问Tomcat,而是前面挡一个Nginx做反向代理,Nginx负责处理静态资源和并发连接,Tomcat只处理动态请求。
反向代理配置示例
在nginx.conf的server块里写:
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
配置好执行nginx -s reload生效。
动静分离怎么处理
Tomcat处理图片、CSS、JS效率不如Nginx,把静态资源目录单独用Nginx分发,可以明显减轻Tomcat压力,具体做法是Nginx的location规则里给静态文件后缀加root /data/static;,让Tomcat只跑Java逻辑。
java项目部署到服务器前的必要检查项
很多项目本地能跑,一到服务器就挂,下面这些问题占了八成原因:
- 数据库连接:localhost改成服务器能访问的数据库IP,时区参数加上
serverTimezone=Asia/Shanghai -
文件上传路径
:本地是/Users/xxx/temp,服务器上得换成/data/uploads,不然后台报错或者文件丢了 - 内存配置:Tomcat默认堆内存可能不够,修改catalina.sh里的
JAVA_OPTS="-Xms512m -Xmx1024m",具体大小看服务器物理配置 - 字符编码:server.xml的Connector加
URIEncoding="UTF-8",避免参数乱码
部署完成后怎么确认项目稳定运行
启动成功只是第一步,部署到生产环境后,至少要验证三件事:
- 看进程是否常驻:执行
ps -ef | grep tomcat,确认java进程还在 - 看日志有没有持续报错:
tail -f logs/catalina.out,等两分钟确认没有新异常 - 用curl模拟访问一个接口:
curl -I http://127.0.0.1:8080/项目名/health,返回200就正常
如果项目运行一两天后变卡,多半是内存泄漏,用jstat -gcutil 进程号 1000看Full GC频率,如果频繁接近100%,就得优化代码或者调大堆内存。
常见部署问题速查
Q:tomcat部署java war包和jar包的区别是什么?
A:WAR包需要外置Tomcat环境,把包丢进webapps由容器管理生命周期,支持热替换;JAR包自带Tomcat和Spring Boot环境,用java -jar直接启动,部署更简单但启动后无法通过Tomcat管理器统一监控,如果项目用JSP视图层,必须使用WAR包,JAR包不支持JSP热编译。
Q:java项目部署到tomcat服务器上遇到端口被占用怎么解决?
A:先执行netstat -lnp | grep 8080找出占用进程,确认不是必要服务就kill掉;如果是别的程序要用8080,就改Tomcat端口,记住改完server.xml要重启Tomcat,同时检查浏览器缓存是否还指向旧端口。
Q:WAR包更新部署后还是老代码怎么办?
A:多数情况下是Tomcat没清理临时目录,把webapps下的项目目录和work/Catalina目录一并删掉,再把新WAR包放进去重启,生产环境推荐用脚本先备份旧包,再删干净,最后复制新包,避免出现半个新半个旧的脏状态。
把Java项目部署到Tomcat这件事,熟练以后就是一套固定流程:打WAR、放webapps、启动、看日志、验访问,核心记住两点:环境版本必须匹配,日志是定位一切问题的钥匙,多部署几次,遇到一次报错解决一次,比看任何教程都学得快。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/734109.html





