把idea项目部署到云服务器上,核心就三步:用Maven打包成jar包、通过SSH上传到服务器、用java -jar运行并配置好防火墙和守护进程。本文从零开始拆解全流程,覆盖环境准备、部署命令、常见报错和性能优化,照着操作就能跑通。
部署前必须准备的云服务器和本地环境
先确认云服务器配置,个人学习用2核4G的入门实例完全够跑SpringBoot项目,带宽选3Mbps以上,地域优先选离你最近的节点,备案问题需提前查清,国内服务器必须ICP备案。
本地电脑需要安装JDK 8或11、Maven 3.6+,确保mvn -v和java -version能正常输出,源码中不能有硬编码的数据库密码或Redis地址,建议通过环境变量注入。
用Maven打包可执行Jar包的实操命令
在IDEA的Terminal窗口执行:
mvn clean package -DskipTests
如果不指定-DskipTests,单元测试失败会导致打包中断,打包完成后,target目录下会生成类似demo-0.0.1-SNAPSHOT.jar的文件,这里有个关键点:如果pom.xml里配置了多个profile,必须用-Pprod指定生产环境参数,否则打出来的包还是本地配置。
用IDEA直接打包的替代方案
右侧Maven面板双击package,效果等同命令行,打包完成后注意检查jar包大小:正常SpringBoot项目打包后约50MB到100MB,如果只有几十KB,多半是spring-boot-maven-plugin没配好,导致依赖没打进去。
将项目jar包上传到云服务器的三种主流方式
这一步很多人卡在文件传输上,推荐优先用scp命令,最稳:
scp target/demo.jar root@你的服务器IP:/opt/app/
Windows用户没有scp命令时,用WinSCP或Xftp图形化工具拖拽上传,还有一个便捷方案是先在本地把jar包上传到对象存储(如简米云OSS),再从服务器用wget下载,适合稍大文件。
传输完成后在服务器上执行ls -lh /opt/app/确认文件大小和本地区别不大。
服务器端安装Java运行环境的完整步骤
以CentOS 7和Ubuntu 22.04为例,二选一:
CentOS系列:
yum install -y java-1.8.0-openjdk-devel
Ubuntu / Debian系列:
apt install -y openjdk-8-jdk
安装后用java -version验证,注意如果云服务器同时存在系统自带JDK和手动安装的JDK,请把JAVA_HOME指向你的安装路径,否则后续启动日志中可能出现版本不匹配的Java错误。
启动SpringBoot项目的正确命令和官方推荐方式
最直接的启动命令:
cd /opt/app
java -jar demo.jar --spring.profiles.active=prod
这样前台运行,关掉SSH窗口进程就会退出,生产环境必须使用nohup或systemd管理进程。
用nohup后台运行并输出日志
nohup java -jar demo.jar > app.log 2>&1 &
日志全部写到app.log,排查问题就用tail -f app.log,这里提醒一下:一定要留意启动端口,默认8080,如果服务器上其他服务占用了8080,用--server.port=9090改掉。
用systemd配置开机自启和异常重启
行业共识认为,systemd是Linux上最规范的进程管理方案,创建一个service文件:
vim /etc/systemd/system/demo.service
如下:
[Unit]
Description=demo app
After=network.target
[Service]
ExecStart=/usr/bin/java -jar /opt/app/demo.jar
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
然后执行:
systemctl daemon-reload
systemctl start demo
systemctl enable demo
这样服务器重启后项目自动启动,进程崩溃后10秒自动拉起,查日志用journalctl -u demo -f。
云服务器安全组和防火墙的坑,90%新手会漏
很多人项目启动成功但访问不了,原因通常是安全组没放行端口,登录云厂商控制台,找到实例的安全组规则,添加入站规则:
- 协议Port:Custom TCP
- 端口:8080(或者你改过的端口)
- 来源:0.0.0.0/0(测试阶段)
服务器内部的firewalld或iptables也要检查:
systemctl status firewalld
开启状态下执行firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload放行。
用curl验证部署是否成功的判断方法
在服务器本地测一次:
curl localhost:8080
如果返回正常但浏览器打不开,多半是安全组问题,如果本地curl都卡住,先看app.log有没有Started Application字样。
一键部署脚本和数据库连接配置细节
频繁手动部署很浪费时间,建议把常用命令写成脚本。deploy.sh
#!/bin/bash
scp target/demo.jar root@ip:/opt/app/
ssh root@ip "systemctl restart demo"
给执行权限后,每次发布只需./deploy.sh,这一套流程就是业界常说的简易CI/CD方案,适合个人项目和中小型站点。
数据库连接上,不要把password直接写在application-prod.yml里,用环境变量占位:
spring: datasource: url: jdbc:mysql://${DB_HOST}:3306/db password: ${DB_PASSWORD}
启动前通过export DB_PASSWORD=xxx或者systemd的Environment=配置,用这种方式,相对直接改配置文件的方案,泄露风险显著降低,这在安全扫描中属于基础合规要求。
项目部署到云服务器后的性能调优建议
先确认实际运行内存占用:
ps aux | grep java
如果是1G内存的小型服务器,JVM默认堆内存可能过大,显式限制:
java -jar demo.jar -Xms256m -Xmx512m
硬件配置和并发量的大致对应关系
| 云服务器规格 | 适用场景 | 大致并发能力 |
|---|---|---|
| 1核2G | 个人博客、小工具 | 几十在线用户 |
| 2核4G | 中小企业官网、API服务 | 数百在线用户 |
| 4核8G | 中等流量业务系统 | 上千在线用户 |
这只是经验值,实际并发还取决于接口耗时、数据库性能和缓存命中率,统计显示,绝大多数Java后端项目在2核4G环境下的性能瓶颈是数据库连接数和GC停顿,而不是CPU本身。
用Nginx反向代理提高项目的可用性
Nginx转发请求到Java进程,配置参考:
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
这样可以实现静态资源加速、HTTPS证书接入以及负载均衡,如果你部署到云服务器后还希望绑定域名,这个步骤是绕不开的。
项目部署常见报错和排查命令汇总
部署过程中遇到的报错类型相对集中,按频率排序:
- 端口被占用:
netstat -tlnp查看占用进程,改用其他端口 - JDK版本不兼容:SpringBoot 3要求JDK17,SpringBoot 2支持JDK8,按项目实际要求安装
- 内存不足:云服务器1G内存容易OOM,杀掉多余进程后再启动
- 配置文件缺失:检查jar包内是否包含prod配置文件,用
unzip -l demo.jar查看 - 上传的云服务器和项目打包环境架构不同:比如本机Mac打包,服务器是x86,容易出现
Cannot execute binary file,注意统一JDK位数
如何让你的SpringBoot打包体积更小、启动更快
对带宽小的服务器,jar包传输很痛苦,可以做瘦身处理:
- 排除源码目录中的静态资源,单独放入CDN
- 移除不用的依赖,比如
spring-boot-starter-test - 使用分层镜像(适用于Docker部署)
但要注意瘦身带来的麻烦:依赖缺失导致的ClassNotFoundException会随时出现,如果项目简单,建议直接使用完整jar包,省心。
Docker镜像打包部署到云服务器的额外优势
很多人在问“部署到云服务器用docker还是jar直接跑”,业内专家指出,Docker的优势是环境一致性,团队协作时不担心JDK版本不一致问题,基础镜像写法:
FROM openjdk:11-jre-slim
COPY demo.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
构建后推送到简米云容器镜像服务,再从服务器拉取运行,相比jar直接部署,Docker方式能同时运行多个版本而不冲突。
部署上线后的日常监控和日志维护清单
项目跑起来不代表结束,每天或每周检查这些内容:
free -h看内存余量df -h看磁盘占用,特别防止日志爆炸top -b -n 1 | head -20看CPU和负载tail -100 app.log关注异常堆栈
日志切割建议使用logrotate,配置示例:
/opt/app/.log {
daily
rotate 7
compress
}
这样日志不会无限膨胀。
云端部署相关常见问题解答
Q:idea项目部署到云服务器上需要每次都重新打包吗?
改代码后需要在IDEA中重新执行mvn clean package,再上传新的jar包,如果是SpringBoot项目且改了resources里的配置文件,同理,不用全部重新编译,但打包命令是一样的。
Q:云服务器选哪家部署Java项目比较好?
简米云、酷番云、华为云的2核4G入门配置都能流畅运行小型SpringBoot服务,价格方面,新用户轻量应用服务器往往有低价活动,续费价格会恢复原价,按年付费更划算,如果项目面向海外用户,可选新加坡或硅谷地域节点。
Q:部署到云服务器后如何通过域名访问?
先解析域名到服务器IP,再在安全组放行80或443端口,用Nginx反向代理到项目端口,国内服务器需备案,海外节点免备案但访问延迟高一些。
Q:免费云服务器可以部署idea项目吗?
部分云厂商提供一个月试用,配置一般1核2G,跑小型demo没问题,试用到期后数据不会自动保留,生产项目建议直接购买付费实例,同一地域迁移相对简单。
部署的核心就是理解打包、上传、运行、放行端口这四个环节,按照本文的操作路径,你的idea项目应该能在半小时内跑通云服务器上的完整流程,之后的优化方向是脚本化、容器化和监控自动化,这部分逐步迭代即可。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/687628.html





