当前位置: 首页 > news >正文

Spring Boot 项目标准化部署打包实战

Spring Boot 项目标准化部署打包实战

一、目标

将 Spring Boot 项目打包为开箱即用的生产环境部署包。用户解压后只需修改配置文件,运行启动脚本即可启动服务。

最终目录结构

your-app/ ├── bin/ │ ├── startup.sh # Linux 启动脚本 │ └── startup.cmd # Windows 启动脚本 ├── conf/ │ └── application.yml # 外部配置文件(解耦,方便运维修改) ├── lib/ │ ├── your-app.jar # 主程序 JAR │ └── *.jar # 依赖 JAR ├── logs/ # 日志目录(自动创建) └── LICENSE

设计理念

  • 配置与程序分离conf/application.yml独立于 JAR,运维人员无需接触代码
  • 一键启动:封装好 JVM 参数和 classpath 的启动脚本,降低操作门槛
  • 热迭代:后续升级只需替换lib/your-app.jar,配置、依赖、脚本全不动

二、环境要求

组件版本要求
JDK8+
Maven3.6+
Spring Boot2.x

三、Maven 配置

3.1 pom.xml 插件配置

<build><plugins><!-- 1. 依赖拷贝插件:将所有依赖 JAR 拷贝到 target/lib/ --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory></configuration></execution></executions></plugin><!-- 2. Spring Boot 打包插件:生成可执行 JAR --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.1.18.RELEASE</version><configuration><mainClass>com.your.MainApplication</mainClass></configuration><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><!-- 3. Assembly 打包插件:按自定义结构打包为 tar.gz --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><descriptors><descriptor>src/assembly/package.xml</descriptor></descriptors></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>

重要提示:如果使用JDK 8spring-boot-maven-plugin必须锁定版本为2.1.18.RELEASE,否则会报class file version 61.0错误(高版本插件编译的 class 与 JDK 8 不兼容)。


四、Assembly 打包配置

创建src/assembly/package.xml

<assemblyxmlns="http://maven.apache.org/ASSEMBLY/2.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd"><id>release</id><formats><format>tar.gz</format></formats><includeBaseDirectory>true</includeBaseDirectory><baseDirectory>your-app</baseDirectory><fileSets><!-- 启动脚本,权限 755 --><fileSet><directory>src/assembly/bin</directory><outputDirectory>bin</outputDirectory><fileMode>0755</fileMode></fileSet><!-- 配置文件 --><fileSet><directory>src/main/resources</directory><outputDirectory>conf</outputDirectory></fileSet></fileSets><!-- 依赖 JAR 全部打入 lib/ --><dependencySets><dependencySet><outputDirectory>lib</outputDirectory><includes><include>*:jar</include></includes></dependencySet></dependencySets></assembly>

各节点说明

节点作用
<id>release</id>最终产物名后缀:your-app-release.tar.gz
<format>tar.gz</format>打包格式,跨平台通用
<baseDirectory>解压后的根目录名
<fileMode>0755</fileMode>Linux 下脚本可执行权限

五、启动脚本

5.1 Windows 启动脚本

src/assembly/bin/startup.cmd

@echo off set DIR=%~dp0.. cd %DIR% if not exist "%DIR%\logs" mkdir "%DIR%\logs" set JAVA_OPTS=-Xms256m -Xmx1024m -Dfile.encoding=UTF-8 java %JAVA_OPTS% ^ -Dloader.path="%DIR%\lib" ^ -Dspring.config.location=file:"%DIR%\conf\application.yml" ^ -jar "%DIR%\lib\your-app.jar" ^ > "%DIR%\logs\app.log" 2>&1 echo Started. pause

说明%~dp0是批处理脚本自身所在目录,%~dp0..回到项目根目录。^是 Windows 命令行续行符。

5.2 Linux 启动脚本

src/assembly/bin/startup.sh

#!/bin/bash# 获取脚本所在目录的上级目录(即项目根目录)DIR="$(cd "$(dirname"$0")/.."&&pwd)" cd "$DIR" # 创建日志目录 mkdir -p logs # JVM 参数 JAVA_OPTS="-Xms256m-Xmx1024m-Dfile.encoding=UTF-8" # 后台启动,日志输出到 logs/app.log nohup java$JAVA_OPTS\ -Dloader.path="$DIR/lib" \ -Dspring.config.location=file:"$DIR/conf/application.yml" \ -jar "$DIR/lib/your-app.jar" \ > "$DIR/logs/app.log" 2>&1 & echo "Started. PID:$!"

脚本解读

配置项说明
-Xms256m -Xmx1024m初始堆 256M,最大堆 1G(按实际调整)
-Dloader.path指定依赖 JAR 加载路径,配合PropertiesLauncher使用
-Dspring.config.location指定外部配置文件路径,优先级高于 JAR 内的配置
nohup ... &后台运行,终端关闭不中断
$!最后启动的后台进程 PID

六、打包与部署

6.1 打包

mvn clean package

执行后在target/目录下生成your-app-release.tar.gz

6.2 部署

# 1. 解压tar-xzfyour-app-release.tar.gz# 2. 修改配置vimyour-app/conf/application.yml# 3. 启动cdyour-app/bin# Linuxshstartup.sh# Windowsstartup.cmd

部署只需三步:解压 → 改配置 → 启动


七、迭代更新

后续升级只需替换一个 JAR 文件,流程如下:

  1. 本地改完代码,执行mvn clean package
  2. 将新的your-app.jar上传到服务器
  3. 替换lib/下的旧 JAR
  4. 重启服务

配置、依赖、启动脚本全部不用动,真正实现热迭代。


八、常见问题

8.1 端口被占用

# Windows:查看端口占用netstat-ano|findstr :8080# Windows:杀掉进程taskkill /pid 进程ID /f
# Linux:查看端口占用lsof-i:8080# Linux:杀掉进程kill-9进程ID

8.2 找不到主类

检查pom.xmlspring-boot-maven-plugin<mainClass>配置是否正确,需指向带@SpringBootApplication注解的主类。

8.3 JAR 中没有主清单属性

确保spring-boot-maven-plugin配置了<goal>repackage</goal>,只有repackage才会生成MANIFEST.MF中的Main-Class

8.4class file version 61.0错误

原因:高版本 Spring Boot Maven Plugin(3.x)编译的 class 需要 JDK 17+,与 JDK 8 不兼容。

解决:JDK 8 环境下将spring-boot-maven-plugin版本降级到2.1.18.RELEASE

8.5 配置文件找不到

启动参数中的路径建议使用绝对路径%DIR%/$DIR),避免因工作目录不同导致相对路径解析失败。脚本中已通过DIR变量实现了此逻辑。

8.6 日志文件不输出

  • 确认logs/目录有写入权限
  • 检查启动用户是否有当前目录的写权限
  • nohup输出会先写入nohup.out,确认重定向符号>正确

九、总结

通过Maven Assembly 插件 + 外部配置文件 + 启动脚本的组合,可以将 Spring Boot 项目打包为标准的生产环境部署包

维度收益
部署成本解压 → 改配置 → 启动,三步完成
运维友好配置外置,无需懂 Java 也能改配置、看日志
迭代效率升级只换一个 JAR,秒级完成
跨平台Windows / Linux 均有对应启动脚本
标准化统一的目录结构,不同项目一致,降低认知成本

延伸思考:在生产环境中,可以进一步加入-XX:+HeapDumpOnOutOfMemoryError、GC 日志、JMX 监控等 JVM 参数,结合 Systemd(Linux)或 NSSM(Windows)实现服务托管和自动重启。

http://www.cnnetsun.cn/news/2501501.html

相关文章:

  • 2026毕业答辩PPT模板实测:三个平台的真实体验与避坑建议
  • 打通本地与云端,LangChain 混合部署环境的兼容性避坑手册
  • 艺术设计论文降AI工具怎么选?创意设计类降AI实用方案
  • 《CVPR2025-DEIM创新改进项目实战:从原理到部署的深度学习优化全攻略》016、DEIM在图像分类任务上的改进——ResNet-DEIM与ViT-DEIM
  • 《CVPR2025-DEIM创新改进项目实战:从原理到部署的深度学习优化全攻略》017、YOLO-DEIM与DETR-DEIM的调试手记
  • 离散几何拓扑数论(终稿·全定义完整版一)
  • CANN 算子调优:榨干昇腾硬件性能
  • BOM(全)
  • Agentic Search能替代GraphRAG吗,结论清晰了
  • 多模态AI应用开发:从理论到实践
  • 谷歌搜索SEO优化需要做什么?4个步骤快速做好站内优化
  • 新手必看,五分钟完成Taotoken的API Key申请与基础配置
  • LLM 认知框架:揭秘时间序列与空间结构,洞悉 AI 未来!
  • 【BUUCTF】【Misc】我有一只马里奥
  • 自研极简C++软交互事件系统:干掉观察者模式、碾压前端事件机制
  • 雷达信号体制识别
  • 超宽自锚式悬索桥模型修正与抗震可靠度分析【附仿真】
  • 独立开发者如何借助Taotoken低成本验证AI应用创意与可行性
  • 论文定稿≠答辩结束?okbiye AI PPT,把你从答辩 PPT 的 “熬夜地狱” 里捞出来
  • 向量数据库选型2026:Qdrant vs Pinecone vs Weaviate vs Chroma深度对比
  • AICoverGen完整指南:零基础打造专业级AI翻唱音乐的终极方案
  • 四轮独立驱动电动汽车操纵稳定性关键状态参数估计及协调控制策略【附代码】
  • 技术人的人际关系:建立良好的职业网络
  • 从物理光学到AI生成:揭秘玻璃折射率n=1.52如何映射为--s 750 + --iw 1.8的底层逻辑
  • 【Midjourney单色调风格终极指南】:20年AI视觉设计专家亲授3大调色公式、7类灰阶映射逻辑与避坑清单
  • Midjourney金属渲染避坑清单(2024Q2最新):6类典型翻车案例+对应反向Prompt修复模板
  • Django 从 0 到 1 打造完整电商平台:登录与登出功能实现
  • 鸿蒙生鲜电商页面构建:商品网格与配送档期模块详解
  • 2026爆火!5款AI论文软件亲测,打破思路枯竭,初稿半天搞定
  • 2026 免费在线去水印工具怎么选?详细优缺点对比与实用推荐指南