把jar包部署到服务器,核心就三步:装好Java环境、把jar包传上去、用命令让它跑起来并保持后台运行。听起来简单,但实际操作中,很多人栽在环境变量没配好、端口被占用、进程被系统杀掉这些细节上,下面按步骤拆开讲,每一步都是可以直接照着敲的命令。
jar包怎么部署到服务器的标准流程
第一步:检查服务器环境,别让Java版本拖后腿
jar包本质上是一个压缩的Java程序,服务器上必须先有Java运行时环境(JRE)或Java开发工具包(JDK),很多部署失败案例,不是因为代码有问题,而是服务器上根本没装Java,或者版本和本地开发环境不一致。
先登录服务器,用下面这条命令确认是否已安装Java:
java -version
- 如果显示类似
openjdk version "1.8.0_xxx",说明已有Java环境,但要注意版本是否和你项目编译时的版本匹配。 - 如果提示
command not found,说明需要手动安装,以CentOS系统为例:
sudo yum install -y java-1.8.0-openjdk-devel
Ubuntu系统则用:
sudo apt update && sudo apt install -y openjdk-8-jdk
行业共识认为,Java 8和Java 11是当前生产环境使用最广泛的两个版本,如果你的项目是用Spring Boot 2.x写的,装Java 8基本不会出错。
还需要确认服务器上有没有预留足够的磁盘空间和内存,一个中型Spring Boot项目的jar包通常在50MB到200MB之间,但运行时会额外占用内存和临时磁盘空间,建议服务器的内存至少2GB,磁盘剩余空间至少5GB,这样跑起来才不会捉襟见肘。
第二步:把jar包上传到服务器,选对工具和上传路径
jar包部署前先得让服务器拿到文件,常用的上传方式有scp命令、宝塔面板、以及FTP工具。
本地电脑是Windows系统的话,可以在cmd或PowerShell里执行:
scp D:projectsmyapp.jar root@你的服务器IP:/opt/app/
本地是Mac或Linux系统的话,同理:
scp /Users/me/projects/myapp.jar root@你的服务器IP:/opt/app/
这里建议把jar包统一放到/opt/app或/data/www这类目录下,不要随手丢在/root下,规范目录管理对后期维护和日志查找非常重要。
如果觉得输命令麻烦,也可以装个宝塔面板,用自带的可视化文件管理器直接拖拽上传,不过对专业运维来说,命令行是更通用且可控的方式
。
上传完成后,记住jar包的绝对路径,比如/opt/app/myapp.jar,后面每一步都会用到。
第三步:用好nohup命令,让jar包后台运行并能持续服务
刚接触时,很多人直接执行:
java -jar myapp.jar
这种前台启动方式,一关闭终端窗口,程序就会被终止,虽然Ctrl+C能停掉,但也会带走整个进程,生产环境绝不能用这种方式。
正确做法是用nohup配合&符号让程序脱离终端会话独立运行:
cd /opt/app nohup java -jar myapp.jar > app.log 2>&1 &
拆开看这条命令的意思:
- nohup:不挂断地运行命令,即使终端窗口关掉,进程也继续跑。
- > app.log:把程序输出的日志写到app.log文件里。
- 2>&1:把错误输出也重定向到同一个日志文件,方便统一排查。
- 最后的&:代表在后台运行,命令执行完立刻回到终端提示符。
执行后,屏幕会显示一个进程ID(PID),这就是这个jar包进程的唯一编号。
接下来用jps或ps -ef确认进程是否正常拉起:
ps -ef | grep myapp.jar
看到类似java -jar myapp.jar的进程记录,说明后台运行成功,此时查看日志确认启动状态:
tail -100f app.log
看到Started MyApplication in xxxx seconds这类字样,基本就是启动成功了。
Linux部署jar包如何配置开机自启动,防止服务器重启后服务挂掉
用nohup启动的进程,在服务器意外重启后不会自动恢复,如果不想每次重启后都手动跑一遍命令,就应该把jar包注册成systemd服务,这也是生产环境推荐的部署方式。
注册systemd服务,让jar包像正式系统服务一样被管理
以CentOS 7及以上版本为例,创建一个服务配置文件:
sudo vim /etc/systemd/system/myapp.service
[Unit]
Description=My Spring Boot Application
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/app
ExecStart=/usr/bin/java -jar /opt/app/myapp.jar
SuccessExitStatus=143
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
每项配置的含义都值得搞清楚:
- After=network.target:确保网络服务启动后才拉起这个应用,避免因网络未就绪导致启动失败。
- Restart=always:进程异常退出时,系统会自动拉起,这是保证服务可用性的关键。
- RestartSec=10:重启前等待10秒,防止因瞬时故障导致频繁重启。
- SuccessExitStatus=143:告诉systemd,退出码143属于正常退出(对应SIGTERM信号),不算错误。
配置写好后,依次执行这些命令:
sudo systemctl daemon-reload sudo systemctl enable myapp.service sudo systemctl start myapp.service
enable让服务开机自启动,start立即启动,检查运行状态:
sudo systemctl status myapp.service
看到Active: active (running)说明服务运行得健康。
以后更新jar包时,只需要替换jar文件然后执行sudo systemctl restart myapp即可,比nohup方案要优雅得多。
springboot jar包linux服务器部署时的内存调优方案
Spring Boot项目默认堆内存设置比较保守,需要在启动时显式指定JVM内存参数,否则大并发场景下很容易内存溢出。
常见启动参数:
java -Xms512m -Xmx1024m -jar myapp.jar
- -Xms:JVM初始堆内存大小
- -Xmx:JVM最大堆内存上限
如果服务器内存有4GB,建议设置为-Xms512m -Xmx2g,预留足够余量给操作系统的文件缓存和线程栈。
内存充足的情况下,还可以开启JVM的G1垃圾回收器:
java -XX:+UseG1GC -Xms512m -Xmx2g -jar myapp.jar
这些参数在nohup启动和systemd配置的ExecStart中都可以使用。
jar包部署后访问不通,如何高效排查和定位
多数情况下,jar包部署完成后应通过ip:端口访问服务,如果浏览器无法访问,按下面优先级排查:
第一步:确认服务有没有真正监听端口
假设项目端口是8080,在服务器上执行:
netstat -tlnp | grep 8080
如果看不到任何输出,说明应用根本没监听这个端口,继续看日志找启动报错。
第二步:查看应用日志定位启动失败原因
日志是部署排查中最直接的线索,常见错误和对应解决方案如下:
| 报错特征 | 原因分析 | 解决路径 |
|---|---|---|
Port 8080 was already in use |
端口被其他进程占用 | 用netstat -tlnp | grep 8080找到占用进程,或修改应用的server.port |
Unable to connect to database |
数据库连接信息错误 | 检查数据库地址、账号、密码是否匹配服务器环境 |
No such file or directory |
配置文件里引用的路径不存在 | 在当前目录创建对应目录后再启动 |
java.lang.OutOfMemoryError |
堆内存不足 | 调大-Xmx参数,或检查是否存在内存泄漏 |
第三步:检查防火墙和安全组规则
服务本身没问题但外部访问不通,要考虑两种拦截:
- 服务器系统防火墙:CentOS查看是否放行该端口:
sudo firewall-cmd --list-ports
没有放行的话执行:
sudo firewall-cmd --add-port=8080/tcp --permanent && sudo firewall-cmd --reload
- 云服务商安全组:简米云、酷番云的服务器还有一层安全组规则,必须在控制台里放行对应端口,否则系统防火墙无论怎么开放外部都无法访问。
完成一次最小化部署后,下一步还应该做什么
到这里,jar包已经在服务器上跑起来了,日志正常输出,端口也能访问,后续运维环节往往决定了部署是否稳定:
- 配置日志轮转,避免日志文件无限增长占用磁盘。
- 开启定时健康检查,脚本定期请求
/actuator/health端点,挂掉就自动重启。 - 如果项目有数据库连接池和Redis配置,务必检查生产环境的连接地址和本地的差异,这是最常见的”本地能跑服务器挂掉”的原因。
常见问题解答
为什么我用java -jar启动后,关闭终端服务就停了
因为java -jar是前台进程,终端退出时系统会向该进程组发送SIGHUP信号导致进程终止,解决方式是使用nohup java -jar xxx.jar > app.log 2>&1 &启动,或注册成systemd服务,让进程脱离终端生命周期。
jar包端口8080被占用了怎么办
先用netstat -tlnp | grep 8080找到占用进程的PID,然后根据进程实际情况判断是否可以终止,或在application.yml里修改server.port为8081等可用端口,然后重启jar包。
更新jar包版本时,直接覆盖旧文件再重启可以吗
可以,用systemctl restart管理服务时会重新加载jar包内容,因此覆盖jar文件后执行重启即可生效,不过建议先备份旧版本,以便出现问题时快速回滚,这是线上应用更新时比较稳妥的做法。
最后更新时间: 2026-01-14
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/683473.html





