【Spring Boot JAR 解压修改配置后重新打包全流程(避坑指南)】

Spring 博客笔记:Spring Boot JAR 解压修改配置后重新打包全流程(避坑指南)

在开发或部署 Spring Boot 项目时,经常需要解压 JAR 包修改配置文件(如数据库连接、端口等),再重新打包启动。但手动操作很容易踩坑(比如启动类缺失、嵌套 JAR 压缩错误),这里梳理一套完整的 Windows 环境下操作流程,附常见问题解决方法。

一、核心流程:解压 → 修改 → 正确打包

1. 第一步:解压 JAR 包(保持目录结构)

先在 JAR 包同级目录新建 unpacked 文件夹,用于存放解压后的文件,避免文件混乱:

powershell 复制代码
# 1. 新建解压目录(若已存在则跳过)
mkdir unpacked

# 2. 进入解压目录
cd unpacked

# 3. 解压 JAR 包(..\fbsgf_sync.jar 是原 JAR 路径,根据实际修改)
jar xf ..\fbsgf_sync.jar

解压后会看到 Spring Boot 标准目录结构:

复制代码
unpacked/
├─ META-INF/          # 清单文件、签名等(关键:含 MANIFEST.MF)
├─ BOOT-INF/          # 项目核心内容
│  ├─ classes/        # 你的代码编译后的 class、配置文件(要修改的在这里)
│  └─ lib/            # 依赖 JAR(如 HikariCP、spring-core 等,不可压缩)
└─ org/               # Spring Boot 启动器(含 JarLauncher,必须保留)

2. 第二步:修改配置文件

找到 BOOT-INF/classes 目录下需要修改的配置文件(如 application.yml、application-ysj.yml),直接用记事本或 IDE 编辑:

powershell 复制代码
# 示例:修改 application-ysj.yml(路径根据实际配置文件调整)
notepad BOOT-INF/classes/application-ysj.yml

⚠️ 注意:只修改 BOOT-INF/classes 下的文件,不要删改 BOOT-INF/lib、org、META-INF 目录的内容,否则会导致启动失败。

3. 第三步:关键!正确重新打包(避坑核心)

手动打包最容易出问题,必须满足两个条件:

  • 包含 org 目录(Spring Boot 启动器 JarLauncher 在这);
  • BOOT-INF/lib 下的依赖 JAR 不压缩(用 0 参数指定);
  • 显式指定 META-INF/MANIFEST.MF 作为清单文件(含主类配置)。

在 unpacked 目录执行以下一行命令:

powershell 复制代码
# 格式:jar c0fm 输出JAR路径 清单文件路径 要打包的目录
jar c0fm ../fbsgf_sync-fixed.jar META-INF/MANIFEST.MF org BOOT-INF META-INF

命令参数说明:

  • c:创建新 JAR 包;
  • 0:不压缩文件 (关键!确保 BOOT-INF/lib 依赖正常加载);
  • f:指定输出 JAR 文件名(../fbsgf_sync-fixed.jar 表示输出到上级目录);
  • m:指定清单文件(META-INF/MANIFEST.MF,含 Main-Class: org.springframework.boot.loader.JarLauncher);
  • 最后三个参数 org BOOT-INF META-INF:把这三个目录完整打包(缺一不可)。

二、打包后验证:确保没问题再启动

打包完成后,先验证两个关键点,避免白跑一趟:

1. 验证 1:是否包含启动器 JarLauncher

检查输出的 JAR 包中是否有 org/springframework/boot/loader/JarLauncher.class:

powershell 复制代码
# 回到上级目录(JAR 包所在目录)
cd ..

# 查看 JAR 包内容,筛选启动类
jar tf fbsgf_sync-fixed.jar | findstr "JarLauncher.class"

如果输出以下内容,说明启动器正常包含:

复制代码
org/springframework/boot/loader/JarLauncher.class

2. 验证 2:启动 JAR 包

执行启动命令,测试是否正常:

powershell 复制代码
java -jar fbsgf_sync-fixed.jar

如果看到 Spring Boot 启动日志(如 Started Application in XX seconds),说明流程成功;若报错,参考下面的"常见问题"解决。

三、常见问题及解决方案

问题 1:启动报"找不到或无法加载主类 org.springframework.boot.loader.JarLauncher"

  • 原因:打包时漏掉 org 目录,或 org 目录路径不对。
  • 解决:重新打包时,确保命令最后包含 org 目录(如 jar c0fm ... org BOOT-INF META-INF)。

问题 2:启动报"Unable to open nested jar file 'BOOT-INF/lib/XXX.jar'"

  • 原因:打包时用了压缩(没加 0 参数),导致 BOOT-INF/lib 依赖无法加载。
  • 解决:重新打包时必须加 0 参数(如 jar c0fm ...),确保依赖不压缩。

问题 3:启动报"XXX.jar 中没有主清单属性"

  • 原因:打包时没指定 m 参数和清单文件,JVM 找不到主类。
  • 解决:打包命令中必须包含 m META-INF/MANIFEST.MF(如 jar c0fm ... META-INF/MANIFEST.MF ...)。

四、总结

手动解压修改 Spring Boot JAR 包的核心是"不删改关键目录+正确打包参数":

  1. 只改 BOOT-INF/classes 下的配置;
  2. 打包用 jar c0fm 命令,包含 org BOOT-INF META-INF 三个目录;
  3. 打包后先验证启动器是否存在,再启动。

按这个流程走,能避开 90% 以上的手动打包问题,比反复试错高效得多~

相关推荐
姜鱼问生10 小时前
2G 内存跑 5 个容器频频 OOM?一招 Swap 抢救你的 2核2G 小破服务器
后端
jose10 小时前
存量 Eureka 平滑接入 Nacos:内嵌 Sync 与双注册 SDK 双路线对比
后端·架构
lazy H11 小时前
【计算机网络】第 2 篇:一条数据如何穿过网络?彻底理解数据封装与解封装
网络·经验分享·后端·学习·计算机网络
我命由我1234511 小时前
软件工程概念 - 可插拔性
java·后端·学习·java-ee·系统架构·软件工程·学习方法
Bazingga11 小时前
RAG路由全景:一个问题走到岔路口,谁来指路
后端
云边有个稻草人11 小时前
从日志到落库:数据集成产品 KFS 如何打通异构数据库实时同步链路
后端
努力小陈112 小时前
从 Java 到 Go:后端工程师的 30 分钟语法速查
后端
Thneonl12 小时前
一个 502,十种病因:nginx 反代排障分诊树
后端·架构
花间相见12 小时前
【计算基础|MySQL09】索引(下):失效与设计
数据库·后端·面试
南丘山12 小时前
接口自动化测试从零搭:31 条用例跑 4 秒,抓出 6 个权限缺陷
后端