拿到服务器源码出的WAR包(很多人习惯叫was包)后,核心就三步:放到Tomcat的webapps目录、启动服务、验证访问,别慌,这篇把每一步的坑和实操都给你捋清楚。
部署前先搞清楚:你手里这个WAR包能跑吗
很多新手一上来就把包扔服务器,结果启动报错一脸懵。绝大多数部署失败,都死在环境不匹配上。 先花两分钟做三个检查,能省掉后面俩小时的排错时间。
确认JDK和容器版本匹配
WAR包是编译好的Java Web应用,运行时必须有对应的Java环境。行业共识认为,JDK版本不匹配导致的报错,占部署失败原因的相当一部分。 先跑 java -version 看一下服务器上的JDK版本,再确认你的WAR包是用哪个版本编译的。
- 如果你的包是用JDK 8编译的,跑在JDK 11上大概率会报
UnsupportedClassVersionError - Spring Boot 2.x的包需要JDK 8以上
- Spring Boot 3.x的包要求JDK 17起
如果服务器还没装Java,用 yum install -y java-1.8.0-openjdk(CentOS系)或 apt install openjdk-8-jdk(Ubuntu系)先把环境装好。
看看WAR包文件本身是否完整
用 ls -lh 看包大小,如果只有几KB,基本可以断定是打包过程中出了问题,正常的WAR包少说也有几MB到几十MB,里面包含了你的业务代码、依赖jar包、配置文件。
验证方法很简单:在本地解压一下,看到 WEB-INF 目录下有 web.xml(老项目)或者 classes 目录下有编译好的 .class 文件,说明包结构没毛病。
提前查好端口占用情况
Tomcat默认跑在8080端口,但这个端口太容易被别的服务占了,打包前先问自己:这台服务器上是不是已经跑着别的Java进程? 用 ss -lntp | grep 8080 探一眼,被占了就改Tomcat的 server.xml 里的端口配置,或者做好端口映射的准备。
war包部署到tomcat的完整步骤
环境检查完了,下面进入实操,以最常见的Tomcat为例,整个流程走一遍。
第一步:把WAR包传到服务器
本地用scp命令最直接:
scp your-app.war root@你的服务器IP:/tmp/
如果你用的是宝塔面板,直接进文件管理上传到 /www/server/tomcat/webapps/ 就行。别传到 /root 或者 /home 下面,然后到处找不到,这是最常见的手误。
第二步:放进Tomcat的webapps目录
cd /usr/local/tomcat/webapps/ mv /tmp/your-app.war .
Tomcat会自动检测到webapps目录下的新增WAR包,并在启动时自动解压,解压出来的文件夹名字默认就是WAR包的文件名,your-app.war 解压成 your-app/。
这里有个关键细节:如果你想让应用在根路径(即直接访问IP:8080就能打开),把WAR包改名为 ROOT.war 再放进去,比如你想直接访问 http://服务器IP:8080/ 而不是 http://服务器IP:8080/your-app/,就得这么干。
第三步:启动Tomcat并盯日志
cd /usr/local/tomcat/bin/ ./startup.sh
启动后别急着高兴,马上看日志:
tail -f /usr/local/tomcat/logs/catalina.out
看到 Deployment of web application archive [../webapps/your-app.war] has finished 这行,说明部署成功,如果抛异常,日志里会告诉你具体原因,这也是后面排错的主要依据。
部署后怎么验证WAR包真的起来了
Tomcat启动了不代表你的应用就能访问,还得走一遍验证流程。
从日志里读关键信息
除了刚才的部署完成提示,还要看有没有 Server startup in [xxx] milliseconds,这句话说明整个容器都起来了。这一步很多人跳过,结果浏览器打不开才回头翻日志,大可不必。
用curl和浏览器双管齐下
先在你服务器本机上测:
curl -I http://localhost:8080/your-app/
看到 HTTP/1.1 200 说明服务正常响应,如果返回404或500,说明应用内部还有问题,继续翻日志。
然后在你的本地浏览器里访问 http://服务器公网IP:8080/your-app/,这一步打不开,大概率是云服务器的安全组规则没放行8080端口,去简米云或酷番云的控制台把入方向规则加上即可。
接口层面测试
如果你的包里有对外API,用Postman或者curl测一下具体路径,返回JSON或预期数据,才叫真正部署完成了。
服务器war包部署失败的常见原因
这里把平时坑人最多的几个问题集中说一下,多数情况下排错顺序是:端口 → 内存 → JDK → 数据库连接。
内存不够,Tomcat直接崩
WAR包应用启动需要一定堆内存,尤其是Spring Cloud这类重框架,默认的Tomcat启动参数往往不够用。
解决办法是在 bin/catalina.sh 里加上:
JAVA_OPTS="-Xms512m -Xmx1024m"
具体值看服务器配置。云服务器1G内存的机器,别硬给Xmx设2048m,系统会直接OOM。
8080端口被占用,起不来
现象是 startup.sh 执行没报错,但进程就是没了,用 netstat -lntp 看一下,如果是另一个Java进程占着,要么杀掉旧进程,要么改Tomcat端口。
JDK版本不兼容,启动报ClassNotFoundError
前面提过的 UnsupportedClassVersionError 是最典型的,这种错误日志里能看到 Bad version number 字样,直接卸掉旧版本,安装编译WAR包时的对应JDK版本。
数据库连接失败,应用起了一部分
如果WAR包里有Spring Boot应用或SSH框架,连不上数据库时启动过程会很磨蹭,日志里反复出现 Cannot create PoolableConnectionFactory。排查方向:数据库IP是否写死、账号密码是否正确、云服务器RDS的白名单是否放行了你这台应用服务器的IP。
Q&A:关于war包部署的高频疑问
问:把WAR包放在服务器源码目录里,和放在Tomcat的webapps目录有什么本质区别?
答:WAR包必须放在Web容器的部署目录下才能被自动加载,放在源码目录只代表文件存到了服务器上,Tomcat根本不会去扫描那个位置,你手动解压到webapps下也行,但Tomcat本身就有自动解压WAR的机制,没必要多此一举。
问:部署WAR包需要额外收费吗?
答:Tomcat本身是Apache基金会开源项目,完全免费,如果用的是云厂商的应用托管服务,按实例规格计费,跟在服务器上手动装Tomcat是两条路,费用取决于你买的云服务器带宽和配置,部署WAR包这个动作本身不产生任何额外费用。
问:服务器地域对war包部署有影响吗?
答:WAR包部署行为与地域无关,北京和上海的服务器操作流程完全一致,地域影响的是网络延迟如果你的目标用户在南方,选酷番云广州节点或简米云华南节点的服务器会更稳;如果业务涉及跨境访问,可能得考虑香港节点的服务器,这属于网络规划层面的取舍,不影响WAR包本身的运行逻辑。
WAR包部署这件事,说穿了就是放对目录、起对服务、盯紧日志,你要做的不是背命令,而是理解每一步在干什么,环境匹配、目录正确、端口放行、日志有进度,这四件事做到位,整个部署过程就是流水线操作,下次再拿到WAR包,按这个思路走一遍,两三分钟就能搞定。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/795676.html


