Java 项目在本地跑通之后,下一步通常是打成 jar 包交给服务器运行。很多人卡在代码之后:jar 上了云,该怎么跑,跑在哪一层,都还没想清楚。阿里云提供 ECS 云服务器、容器服务、函数计算等几种承载方式,先选对方向,后面的步骤会清楚很多。

这篇文章以阿里云 jar 包部署为主线,按实际操作顺序讲:打包、上传、准备运行环境、进程守护,最后是常见报错。适合刚开始把 Java 服务迁到云上的开发者。
一、jar 包在阿里云上通常怎么运行
第一次部署时,最容易搞不清 jar 到底跑在哪一层。大致有三种做法。
- ECS 云服务器直接运行。买一台 ECS,装好 JDK,上传 jar,用命令行启动或交给 systemd 托管。配置自由度最高,适合传统单体应用,但系统更新、补丁和监控都要自己管。
- 容器化部署。写 Dockerfile 把 jar 打进镜像,推送到阿里云容器镜像服务 ACR,再部署到 ACK(容器服务 Kubernetes 版)或 Serverless 容器。前期要学的东西多一些,但扩容、回滚和多环境交付会顺很多,适合有多个服务需要统一管理的团队。
- 函数计算或 Serverless 应用引擎。按调用量计费,不用管服务器。适合请求波动大或以事件触发为主的服务。长时间运行、依赖本地状态的程序就不太适合放在这里。
小项目或个人项目,用 ECS 加 systemd 基本够用。服务多了、需要弹性伸缩,再考虑容器化。
二、实操:把 Spring Boot 的 jar 部署到 ECS
下面以一个叫 order-service 的 Spring Boot 项目为例,走一遍最基础的 ECS 部署流程。
1. 本地打包
在项目根目录执行下面的 Maven 命令,生成可执行 jar。
mvn clean package -DskipTests
产物在 target 目录下,文件名类似 order-service-1.0.0.jar。跳过测试适合在已经验证过的代码上打包,正式发布前最好先完整跑一遍测试。如果 jar 无法用 java -jar 启动,先检查 pom.xml 里有没有配置 spring-boot-maven-plugin,这是最常见的漏配。
2. 上传到服务器
可以用 scp 直接上传,也可以通过阿里云控制台的远程连接功能上传文件。scp 命令这样写。
scp target/order-service-1.0.0.jar root@你的公网IP:/opt/app/
这里用 root 只是为了演示。实际部署时,建议先建一个专门运行应用的用户,把 jar 放到它有权限的目录,让服务不以 root 身份长期运行。应用出问题时,影响范围也会小一些。
3. 安装运行环境
在 ECS 上安装与本地编译时一致的 JDK 版本,比如 JDK 17。装完执行 java -version 确认版本号。版本对不上,后面的报错会很绕。
4. 用 systemd 托管进程
用 nohup 启动最省事,但服务器重启或进程异常退出后,它不会自己拉起来。更稳的做法是新建 systemd 服务文件,比如 /etc/systemd/system/order-service.service,在里面把 ExecStart 设为 java -jar 加 jar 的绝对路径,并设置 Restart=always。写好后执行 systemctl daemon-reload,再用 systemctl enable 和 systemctl start 启动,就能实现开机自启和异常重启。
三、上云后的配置与安全
jar 上了服务器,有几处细节很容易被忽略,但它们直接影响稳定性和安全。
- 敏感配置不要写进 jar。数据库密码、AK/SK 这类信息打进包里,拿到 jar 的人就能看到。改用环境变量或配置中心注入。
- 安全组只放必要端口。业务端口按需开放。SSH 这类管理端口,只允许固定的办公 IP 或跳板机访问,别直接对全网开放。
- JVM 参数按内存设置。-Xms 和 -Xmx 要根据 ECS 的实际内存来定,给操作系统和其他进程留出空间。堆开得太满,高峰期容易被系统杀掉。
- 日志落盘并切分。指定日志目录,按大小或日期滚动。需要集中检索时,再接入阿里云日志服务 SLS。
四、常见报错怎么查
实际部署中,下面几类问题出现得最多。
- 提示 no main manifest attribute。多半是打包时没有使用 Spring Boot 插件,生成的 jar 无法直接运行。回到第一步检查 pom.xml。
- UnsupportedClassVersionError。本地用 JDK 17 编译,服务器却装了 JDK 8。统一两边的 JDK 版本即可。
- 端口访问不了。先在服务器上执行 ss -lntp,确认应用是否真的在监听对应端口。确认服务已经启动,再去查安全组是否放行。两步分开查,能少走弯路。
- 进程莫名消失。用 dmesg 查看有没有 OOM Killer 的记录。如果有,说明内存被系统强制回收了,调低堆内存或升级实例规格都是办法。
五、部署之后
在 ECS 上跑通一次,整个流程就清楚了。打包、上传、装运行环境、交给 systemd 托管,再把配置和安全收紧。业务量上来后,再逐步迁到容器或 Serverless,比一开始就上复杂方案更稳。
文中的命令、路径和端口都需要按自己的项目调整。正式上线前,最好先在测试环境完整走一遍,尤其是服务器重启和进程异常退出后的恢复过程。