在云服务器上运行可运行的jar包,核心就三步:上传jar包、安装Java环境、用命令或systemd启动并保持后台运行。 今天我用一套可直接照抄的流程,帮你把“能跑”变成“跑得稳”。
云服务器怎么运行jar包?先搞清楚这三件事
很多朋友第一次把jar包丢到云服务器上,直接敲java -jar app.jar,窗口一关服务就没了,或者外网死活访问不到,问题往往出在下面这三件事上:
- 确认这个jar包本身能独立运行:本地执行
java -jar app.jar,如果报“没有主清单属性”或缺少依赖,说明包没打对,先解决打包问题再谈部署。 - 确认云服务器上Java环境版本匹配:用
java -version查看,如果项目是JDK 8编译的,服务器上装了JDK 17,可能能跑,但某些框架会有兼容性警告;反过来老版本JDK跑新版class会直接报UnsupportedClassVersionError。 - 确认端口、防火墙和云安全组都放行:这一步最容易被忽略,即使你本地测试一切正常,云服务器外网访问不了,八成是安全组没开端口,而不是程序的问题。
把这三件事捋顺,部署jar包就算走完了一半。
云服务器部署jar包完整步骤:从上传到启动
下面以Linux云服务器(CentOS/Ubuntu/Debian都适用)为例,带你走一遍完整流程。
第一步:把jar包上传到云服务器
常见做法有三种,根据你的使用习惯选一种即可:
- scp命令上传(适合习惯终端的你):在本地电脑执行
scp ./app.jar root@你的服务器IP:/opt/app/,回车后输入密码,注意/opt/app目录要先建好。 - 宝塔面板上传(适合有可视化面板的你):登录宝塔,进入文件管理,找到目标目录,直接拖拽上传,操作感类似网盘。
- 使用云厂商的对象存储中转(适合大文件):先把jar包传到OSS或COS,再通过内网下载到服务器,速度比公网scp快很多。
不管哪种方式,请把jar包放到固定目录,比如/opt/app/,后面所有命令和配置都基于这个路径。
第二步:检查并安装匹配的Java环境
先执行java -version看看有没有Java,如果没有,或者版本不对,按下面的命令安装OpenJDK(以Ubuntu为例):
sudo apt update sudo apt install openjdk-8-jdk # 如果你的项目基于JDK 8 sudo apt install openjdk-11-jdk # 如果基于JDK 11 sudo apt install openjdk-17-jdk # 如果基于JDK 17
CentOS使用yum install java-1.8.0-openjdk
或yum install java-17-openjdk,装完后再执行java -version确认,行业共识认为,Java 8和11依然是存量项目的主力,新项目选17或21的人也越来越多,但请务必以你项目编译时的版本为准。
第三步:启动jar包并保持后台运行
先在前台跑一次,确认无报错:
cd /opt/app java -jar app.jar --server.port=8080
看到“Started Application in x seconds”之类的日志后,说明程序正常启动,这时Ctrl+C结束前台进程,然后改用后台方式启动:
nohup java -jar app.jar --server.port=8080 > app.log 2>&1 &
这条命令把日志写入app.log,进程进入后台,使用ps -ef | grep app.jar查看进程,使用tail -f app.log查看运行日志,但这种方式的缺点是:服务器重启后进程不会自动拉起,进程被误杀也不会自动恢复,所以更推荐下面的systemd方案。
用systemd把jar包做成系统服务
在/etc/systemd/system/app.service中写入配置:
[Unit] Description=My Java Jar App After=network.target [Service] ExecStart=/usr/bin/java -jar /opt/app/app.jar --server.port=8080 WorkingDirectory=/opt/app Restart=always RestartSec=10 User=root [Install] WantedBy=multi-user.target
然后执行:
systemctl daemon-reload systemctl start app systemctl enable app
这样无论进程崩溃还是服务器重启,服务都会自动拉起,这也是目前云服务器运行jar包的主流做法。
云服务器运行jar包常见问题:内存、端口、日志
内存不足怎么办?
很多云服务器默认只有2G内存,Spring Boot项目启动后可能直接报OutOfMemoryError,先用free -h查看内存用量,然后给JVM限定堆内存,比如给1G内存的分配512M:
java -Xms256m -Xmx512m -jar app.jar
如果还嫌不够,可以考虑增加swap分区,但性能不如物理内存,只适合应急。
端口被占用或外网访问不到?
端口被占用时执行lsof -i:8080或netstat -tlnp | grep 8080,找到占用进程PID后kill -9 PID即可。
外网访问不到,重点检查四件事:
- 云安全组:登录云控制台,找到对应的服务器实例,在安全组规则中放行8080端口(入方向,源设为0.0.0.0/0)。
- 系统防火墙:Ubuntu用
ufw status查看,CentOS用firewall-cmd --list-all查看,如果开启,放行对应端口。 - 监听地址:启动jar包时默认监听0.0.0.0,但如果你配置了
,外网肯定访问不了,改成0.0.0.0或删掉该配置。server.address=127.0.0.1
- 程序本身的访问路径:访问时要带上下文路径,比如
http://IP:8080/api。
日志怎么看?
使用tail -f app.log实时追踪日志,如果日志文件太大,用ls -lh app.log确认大小,超过几百M可以考虑配置logback按天滚动,排查问题最常用的命令就是journalctl配合systemd服务,不过前提是你用了systemd方案。
云服务器jar包部署用哪种方式好?直接命令、screen还是systemd
很多教程会让你用screen挂jar包,确实比nohup直观些,但论稳定性,三种方案各有优劣:
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| nohup | 简单、零学习成本 | 服务器重启不自动拉起,进程容易丢 | 临时测试、快速验证 |
| screen | 可挂载多个会话,方便查看 | 同样需要登录后手动恢复,且root权限下易误操作 | 轻量后台运行 |
| systemd | 开机自启、崩溃自动重启、日志统一管理 | 配置稍复杂,需了解systemd语法 | 生产环境、长期运行 |
多数情况下,我建议直接用systemd,它不只是“运行jar包”,而是把jar包当成一个服务来管理,这也是云服务器部署应用的标准姿势。
云服务器跑jar包要什么配置?
很多朋友爱问“1核2G够不够”这类问题,坦白讲,这取决于你的应用类型:
- 纯API接口服务,并发不高:1核2G可以跑,JVM堆内存控制在512M-1G即可。
- Spring Boot +MySQL + Redis,有一定业务逻辑:建议2核4G起步,留出数据库和缓存的空间。
- 定时任务、数据处理类应用:CPU比内存更重要,同样2核4G起步。
如果担心内存不够,可以先用java -XX:+PrintFlagsFinal -version查看默认堆大小,再根据服务器实际内存调整-Xmx参数,需要注意的是,即使配置再高,JVM堆内存也该有上限,避免内存溢出拖垮整台服务器。
简米云服务器部署jar包与常见坑
以简米云为例,部署流程和通用步骤完全一致,但有两个简米云特有的“坑”值得单独说:
- 安全组有两层:简米云控制台的云服务器ECS安全组需要放行端口,同时如果你还启用了云防火墙,也要一并放行,很多人只改了系统防火墙,忘了安全组,结果端口一直不通。
- 使用公网IP直连还要注意安全:如果直接裸奔8080端口,建议尽快改成通过Nginx反向代理到内部端口,并使用HTTPS证书。
这里插一句经验:酷番云服务器运行jar包时,经常遇到“nohup启动后SSH断开服务就挂掉”的问题,其实是因为启动后没有标准输入重定向,加上连接断开未完全杀掉进程组。 解决方法是把启动命令写成:
nohup java -jar app.jar </dev/null > app.log 2>&1 &
把</dev/null加上,再配合systemd,基本就不会出现断SSH丢进程的情况了。
云服务器运行jar包,如何保活和自启动?
这一步实际上是生产环境的最后一块拼图,除了systemd的Restart=always,你还可以配合定时健康检查:
/5 /usr/bin/health_check.sh
核心逻辑:检测进程是否存活,如果挂了就执行systemctl restart app,不过既然用了systemd,这个定时脚本并非必需,systemd已经能处理绝大多数异常退出场景。
简单总结:上传、配环境、启动,是云服务器运行jar包的基本动作;systemd负责保活和自启动,安全组负责外网访问,日志文件负责排查问题。 把这四件事串起来,你的jar包就能像正式服务一样稳定运行了。
云服务器运行jar包:3个高频问题
云服务器运行jar包提示“没有主清单属性”怎么办?
这个问题的全称是no main manifest attribute in app.jar,意思是jar包里缺少启动类信息,解决方法两步走:第一步,在pom.xml(Maven项目)或build.gradle(Gradle项目)里配置Main-Class;第二步,重新执行mvn clean package或gradle bootJar打包,检查打包后的MANIFEST.MF文件,确认里面有Main-Class一行即可。
jar包启动后外网访问不了,一定是程序代码问题吗?
不一定,按频率排序,首先是云安全组未放行端口,其次是服务器防火墙拦截,接着是jar包监听地址绑定到了127.0.0.1,最后才是程序本身逻辑或上下文路径不对,建议按这个顺序排查,大概率在安全组环节就能找到答案。
部署jar包用宝塔还是纯命令行?
两者都能完成部署,宝塔方便管理文件和进程,点几下就能上传、看日志、管理服务,适合不太熟悉Linux命令的运维,纯命令行更透明、路径可控,资源占用也更少,适合已经习惯终端操作的开发者,如果你要长期运行一个关键业务,我更推荐纯命令行加systemd,因为宝塔本身也会占用一部分内存。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/695983.html





