【项目部署上线|第2篇】Spring Boot 项目打包成 jar 并在 Linux 运行
前言上一篇我们已经学习了 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 并配置环境变量。

相关新闻

微信本地数据库解密原理与实战:WechatDecrypt工具深度解析

微信本地数据库解密原理与实战:WechatDecrypt工具深度解析

1. 项目概述与核心价值最近在数据恢复和数字取证圈子里,一个叫 WechatDecrypt 的工具讨论度挺高。起因是不少朋友在换手机、重装系统或者手机意外损坏后,发现微信里那些重要的聊天记录、图片、文件找不回来了,或者想对本地存储的微信数据进行…

2026/7/27 8:39:01 阅读更多 →
ISO/SAE 21434实战:15个核心安全控制点构建汽车网络安全防线

ISO/SAE 21434实战:15个核心安全控制点构建汽车网络安全防线

1. 项目概述:为什么我们需要一张汽车安全的“作战地图”?干了这么多年汽车电子和网络安全,我越来越觉得,现在的智能汽车开发,就像在雷区里盖房子。动力、座舱、智驾,每个域都塞满了代码和芯片,攻…

2026/7/27 8:39:01 阅读更多 →
Claude 5家族模型选择指南:从工具链到工作流的AI开发实践

Claude 5家族模型选择指南:从工具链到工作流的AI开发实践

如果你最近在关注 AI 大模型,可能会发现一个现象:Claude 3 时代,大家讨论最多的是 Opus 的强大和 Sonnet 的性价比,但很少有人把 Haiku 当作主力。为什么?因为 Haiku 虽然快,但能力差距明显,日常…

2026/7/27 8:39:00 阅读更多 →

最新新闻

晚风棱镜数字权益深耕虚拟商品赛道

晚风棱镜数字权益深耕虚拟商品赛道

数字生活全面渗透当下,影音会员、游戏点券、生活卡券、数字素材、软件授权等虚拟商品,早已成为大众日常消费、企业营销运营的刚需。传统综合电商虚拟品类分散、货源杂乱、交易安全缺乏保障,垂直数字权益交易市场长期存在效率、合规、售后多重…

2026/7/27 8:49:07 阅读更多 →
遇到格式报错别慌!AI 导出鸭全方位处理:Claude 公式粘贴后乱码怎么解决?多工具对比方案汇总

遇到格式报错别慌!AI 导出鸭全方位处理:Claude 公式粘贴后乱码怎么解决?多工具对比方案汇总

AI 导出鸭实操指南:Claude公式粘贴后乱码怎么解决?多渠道导出格式错乱问题一站式修复教程遇到格式报错别慌!AI 导出鸭全方位处理:Claude公式粘贴后乱码怎么解决?多工具对比方案汇总AI 导出鸭专业格式转换工具&#xff…

2026/7/27 8:49:07 阅读更多 →
Claude 文档怎么导出?无需复杂操作,AI 导出鸭全平台适配

Claude 文档怎么导出?无需复杂操作,AI 导出鸭全平台适配

Claude文档怎么导出?AI导出鸭一站式搞定各类导出难题Claude文档怎么导出?对比5种导出方式,AI导出鸭优势突出Claude文档怎么导出?无需复杂操作,AI导出鸭全平台适配 引言 不少日常使用Claude做文案、方案、数据分析的从业…

2026/7/27 8:49:07 阅读更多 →
Jupyter客户端MATLAB语法支持:配置指南与实战应用

Jupyter客户端MATLAB语法支持:配置指南与实战应用

在 Jupyter 中实现客户端 MATLAB 语法支持:完整配置与实战指南 对于数据科学和工程计算领域的开发者来说,MATLAB 和 Jupyter 是两个不可或缺的工具。MATLAB 提供强大的数学计算和可视化能力,而 Jupyter 则以其交互式编程环境著称。但长期以来…

2026/7/27 8:49:07 阅读更多 →
YOLOv11与CSFCN融合的软塑料检测系统开发实践

YOLOv11与CSFCN融合的软塑料检测系统开发实践

1. 项目背景与核心价值在工业质检和环保回收领域,软塑料制品的自动检测一直是个技术难点。传统人工分拣效率低下且成本高昂,而常规的视觉检测方案又难以应对软塑料的复杂特性——形状不规则、表面反光、纹理多变。我们团队基于YOLOv11框架,创…

2026/7/27 8:49:06 阅读更多 →
DSP热设计实战:从热阻解析到PCB散热优化,保障SM320F28335-HT稳定运行

DSP热设计实战:从热阻解析到PCB散热优化,保障SM320F28335-HT稳定运行

1. 项目概述:为什么热设计是DSP稳定性的生命线如果你正在使用TI的SM320F28335-HT这颗高性能DSP,尤其是在工业电机驱动、大功率变频器或者高温环境下的控制系统中,那么你大概率已经或即将遇到一个绕不开的难题:芯片烫手。这颗芯片性…

2026/7/27 8:48:06 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻