前言上一篇我们已经学习了 Linux 服务器的一些基础命令比如目录操作、上传文件、查看进程、查看端口、查看日志等。这一篇我们就正式把 Spring Boot 项目从本地打包成 jar 包然后上传到 Linux 服务器运行。这一步非常关键因为项目部署上线的第一步通常不是一上来就 Docker也不是一上来就 Nginx而是先确认后端项目能不能在服务器上单独跑起来。本篇主要完成下面几个内容本地使用 Maven 打包 Spring Boot 项目检查 jar 包是否生成成功上传 jar 包到 Linux 服务器使用java -jar启动项目使用nohup后台运行项目查看进程、端口和日志停止和重启 Spring Boot 项目处理常见启动失败问题一、Spring Boot 项目为什么可以打成 jar 包Spring Boot 项目和传统 Java Web 项目不太一样。以前的 Java Web 项目经常需要打成war包然后部署到 Tomcat 中。而 Spring Boot 内置了 Tomcat所以我们可以直接把项目打成一个可执行的jar包。启动方式也很简单java-jarapp.jar这也是 Spring Boot 部署非常方便的原因。整体流程大概是本地开发项目 | Maven 打包生成 jar | 上传 jar 到 Linux | 服务器安装 JDK | java -jar 启动项目 | 查看日志确认启动成功二、检查 pom.xml 打包配置Spring Boot 项目一般需要在pom.xml中配置打包插件。buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build文字说明这个插件的作用是把项目打成一个可以直接运行的 Spring Boot jar 包。如果没有这个插件打出来的 jar 可能不能直接通过java-jarxxx.jar运行。所以打包前可以先检查一下pom.xml中是否有spring-boot-maven-plugin。三、配置生产环境 application-prod.yml项目部署到服务器时一般不会继续使用本地开发环境配置。比如本地数据库可能是localhost:3306但服务器上数据库可能是 Docker 容器也可能是另一台数据库服务器。所以建议准备一个生产环境配置文件。spring:datasource:url:jdbc:mysql://localhost:3306/project_prod?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghaiusername:rootpassword:******data:redis:host:localhostport:6379password:******server:port:8080logging:file:name:logs/app.log文字说明这里文件名是application-prod.yml后面启动项目时可以指定使用prod环境java-jarapp.jar--spring.profiles.activeprod需要注意写博客或上传代码时密码要脱敏password:******真实项目更推荐使用环境变量password:${DB_PASSWORD}这样不会把真实密码写进配置文件。四、本地使用 Maven 打包项目在项目根目录执行mvn clean package如果想跳过测试可以执行mvn clean package-DskipTests打包成功后一般会在target目录下看到 jar 包target ├── project-0.0.1-SNAPSHOT.jar └── classes文字说明常用命令解释mvn clean package表示先清理旧的构建产物再重新打包。-DskipTests表示跳过测试阶段。如果项目测试用例还没有准备好或者测试环境依赖数据库、Redis打包时可以先跳过测试。五、修改 jar 包名称默认 jar 包名称可能比较长比如zhiguang-0.0.1-SNAPSHOT.jar部署时可以重命名成更简单的名字app.jar在 Windows 可以直接重命名。在 Linux 或 Git Bash 中可以使用mvtarget/zhiguang-0.0.1-SNAPSHOT.jar target/app.jar文字说明jar 包重命名不是必须的但部署时统一叫app.jar会更方便。后面写启动脚本、停止脚本、Dockerfile 时也会更清晰。六、上传 jar 包到 Linux 服务器假设服务器部署目录是/opt/project/backend先在服务器上创建目录mkdir-p/opt/project/backend/logs然后在本地执行上传命令scptarget/app.jar root服务器IP:/opt/project/backend/例如scptarget/app.jar root192.168.1.100:/opt/project/backend/文字说明这个命令的意思是把本地 target/app.jar 上传到服务器 /opt/project/backend/ 目录上传完成后登录服务器查看cd/opt/project/backendls-lh如果看到app.jar说明上传成功。七、在 Linux 服务器前台启动项目进入项目目录cd/opt/project/backend启动项目java-jarapp.jar--spring.profiles.activeprod如果启动成功控制台一般会看到类似信息Tomcat started on port 8080 Started Application in 5.123 seconds文字说明这里的关键参数是--spring.profiles.activeprod表示使用application-prod.yml配置。如果不指定项目会使用默认环境可能读取的是application.yml或开发环境配置。八、测试接口是否可访问如果项目启动在 8080 端口可以在服务器上执行curlhttp://localhost:8080如果项目有健康检查接口也可以访问curlhttp://localhost:8080/actuator/health如果是普通业务接口可以测试curlhttp://localhost:8080/product/1文字说明先在服务器本机访问localhost可以判断项目本身是否启动成功。如果服务器本机能访问但本地浏览器访问不了问题通常不在 Spring Boot 项目本身而可能是服务器防火墙没开放端口云服务器安全组没开放端口项目端口配置错误Nginx 代理还没配置九、后台运行 Spring Boot 项目前台启动有一个问题终端关闭后项目也会停止。所以实际部署时一般使用nohup后台运行。nohupjava-jarapp.jar--spring.profiles.activeprodlogs/app.log21文字说明这条命令很常用拆开看nohup表示忽略终端关闭信号让程序继续运行。java-jarapp.jar--spring.profiles.activeprod表示启动 Spring Boot 项目。logs/app.log表示把标准输出写入日志文件。21表示把错误输出也写入同一个日志文件。表示后台运行。十、查看项目日志后台启动后可以实时查看日志tail-flogs/app.log查看最后 200 行tail-n200logs/app.log实时查看最后 200 行并继续输出tail-n200-flogs/app.log文字说明项目启动成功与否最直接的判断方式就是看日志。如果看到Started xxxApplication Tomcat started on port 8080说明项目启动成功。如果出现异常比如数据库连接失败、Redis 连接失败、端口被占用也都可以在日志里看到。十一、查看 Java 进程查看项目是否正在运行ps-ef|grepjava示例root 12345 1 0 10:00 ? 00:00:05 java -jar app.jar --spring.profiles.activeprod这里的12345就是进程 ID。也可以查看端口ss-tunlp|grep8080示例tcp LISTEN 0 100 0.0.0.0:8080 0.0.0.0:* users:((java,pid12345,fd123))文字说明部署项目时常用两个角度确认项目状态进程是否存在端口是否监听进程存在不一定代表接口正常但进程和端口都正常时项目基本已经启动起来了。十二、停止 Spring Boot 项目先查看进程 IDps-ef|grepjava然后停止kill12345如果项目没有正常停止可以强制停止kill-912345文字说明一般先使用kill进程ID如果没有效果再考虑kill-9进程IDkill -9是强制杀进程不会给程序优雅关闭的机会所以不建议一上来就用。十三、编写简单启动脚本每次手写启动命令比较麻烦可以写一个启动脚本。创建文件vimstart.sh内容如下#!/bin/bashAPP_NAMEapp.jarAPP_HOME/opt/project/backendLOG_FILE$APP_HOME/logs/app.logcd$APP_HOMEnohupjava-jar$APP_NAME--spring.profiles.activeprod$LOG_FILE21echo项目启动中日志文件$LOG_FILE添加执行权限chmodx start.sh启动项目./start.sh文字说明脚本里把 jar 包名称、项目目录、日志路径都定义成变量。后面如果目录变化只需要改脚本变量不用每次重新写一长串命令。十四、编写停止脚本创建停止脚本vimstop.sh内容如下#!/bin/bashPID$(ps-ef|grepapp.jar|grep-vgrep|awk{print $2})if[-z$PID];thenecho项目未运行elseecho正在停止项目PID$PIDkill$PIDecho停止命令已发送fi添加执行权限chmodx stop.sh停止项目./stop.sh文字说明这段脚本会自动查找app.jar对应的 Java 进程。如果找到了就执行kill。如果没有找到就提示项目未运行。十五、编写重启脚本创建重启脚本vimrestart.sh内容如下#!/bin/bashAPP_HOME/opt/project/backendcd$APP_HOME./stop.shsleep3./start.shtail-n100-flogs/app.log添加执行权限chmodx restart.sh执行重启./restart.sh文字说明重启脚本的流程是先停止项目 等待 3 秒 重新启动项目 查看启动日志这在手动部署阶段非常实用。后面如果使用 Docker 或 CI/CD这些脚本会被更自动化的方式替代但学习阶段先掌握脚本很有必要。十六、常见启动失败问题1. 提示 java command not found说明服务器没有安装 JDK或者环境变量没配置好。可以检查java-version如果没有输出 Java 版本就需要先安装 JDK。2. 端口被占用错误日志可能类似Port 8080 was already in use查看端口ss-tunlp|grep8080找到进程后停止kill进程ID或者修改项目端口java-jarapp.jar--server.port80813. 数据库连接失败常见错误Communications link failure Access denied for user Unknown database排查方向数据库服务是否启动数据库地址是否正确数据库端口是否开放用户名密码是否正确数据库名是否存在可以在服务器上测试 MySQLmysql-hlocalhost-P3306-uroot-p4. Redis 连接失败常见错误Unable to connect to Redis server Connection refused排查方向Redis 是否启动Redis 地址是否正确Redis 密码是否正确Redis 端口是否开放如果 Redis 在本机可以测试redis-cliping正常会返回PONG5. 配置文件没有生效如果明明写了application-prod.yml但项目还是读取开发配置可能是启动时没有指定 profile。正确启动方式java-jarapp.jar--spring.profiles.activeprod也可以通过环境变量指定exportSPRING_PROFILES_ACTIVEprodjava-jarapp.jar十七、实际开发建议1. 不要直接在服务器上改 jar 包jar 包应该由本地或构建服务器打包生成然后上传。不要在服务器上临时改代码、临时编译这样后期很难追踪版本。2. 日志目录要固定推荐/opt/project/backend/logs这样排查问题时不用到处找日志。3. 配置和 jar 包分开管理后面可以把配置文件放到/opt/project/backend/config启动时指定java-jarapp.jar --spring.config.additional-location./config/这样更新配置时不一定需要重新打包 jar。4. 先手动跑通再考虑 Docker不要一开始就把 Docker、Nginx、Compose 全部叠上去。先确认 jar 包能在服务器运行后面排查 Docker 问题会轻松很多。十八、总结这一篇我们完成了 Spring Boot 项目从本地打包到 Linux 服务器运行的完整流程。主要内容包括检查 Spring Boot Maven 打包插件准备生产环境配置使用 Maven 打包 jar上传 jar 到 Linux 服务器使用java -jar前台启动使用nohup后台启动查看日志、进程和端口编写启动、停止、重启脚本总结常见启动失败问题这一步是项目部署上线中最基础、也最重要的一步。因为只有先确认 jar 包能在 Linux 上正常运行后面使用 Docker、Nginx、Docker Compose 才有意义。下一篇我们继续补环境准备Linux 安装 JDK、Maven、Git 并配置环境变量。