springboot3使用ProGuard混淆jar

好,现在从干净状态 重新做一轮。先执行"删除旧混淆遗留文件",避免之前错误的 BOOT-INF/classes/BOOT-INF/lib、旧 classes-obf.jar、旧 patch 目录继续污染。

第 1 步:停止正在运行的 Java 进程

先确保没有旧的 flower-shine.jar 占用文件:

bat 复制代码
taskkill /F /IM java.exe

如果提示没有进程,可以忽略。


第 2 步:删除旧混淆工作目录

bat 复制代码
rmdir /S /Q E:\Aflower\obfuscate\work

如果提示目录不存在,可以忽略。


第 3 步:删除旧混淆输出 jar 和 mapping

bat 复制代码
del /F /Q E:\Aflower\obfuscate\flower-shine-obf.jar
del /F /Q E:\Aflower\obfuscate\mapping.txt

第 4 步:重新创建干净工作目录

bat 复制代码
mkdir E:\Aflower\obfuscate
mkdir E:\Aflower\obfuscate\work
mkdir E:\Aflower\obfuscate\work\origin
mkdir E:\Aflower\obfuscate\work\classes
mkdir E:\Aflower\obfuscate\work\patch-classes
mkdir E:\Aflower\obfuscate\work\patch-boot

第 5 步:更新原始 jar 备份

你刚刚已经执行了:

bat 复制代码
mvn clean package -DskipTests

所以现在要把最新打包出来的 flower-shine.jar 复制为新的原始包。

假设最新 jar 已经在这里:

text 复制代码
E:\My_Dream_2026_4_7\Flower_AI\release\A-Zhao\resources\flower-shine.jar

执行:

bat 复制代码
copy /Y E:\My_Dream_2026_4_7\Flower_AI\release\A-Zhao\resources\flower-shine.jar E:\Aflower\obfuscate\flower-shine-original.jar

第 6 步:确认原始 jar 能启动

混淆前必须先确认原始 jar 是正常的:

bat 复制代码
cd /d E:\My_Dream_2026_4_7\Flower_AI\release\A-Zhao\resources
java -jar flower-shine.jar

看到 SpringBoot 正常启动后,按:

bat 复制代码
Ctrl + C

停止。


先执行到这里。

如果第 6 步原始 jar 能正常启动,再继续下一步:解包原始 SpringBoot Jar 并生成 classes-in.jar

好,继续下一步:解包原始 SpringBoot Jar,并生成 classes-in.jar

第 7 步:解包原始 jar

bat 复制代码
cd /d E:\Aflower\obfuscate\work\origin
jar xf E:\Aflower\obfuscate\flower-shine-original.jar

第 8 步:确认启动类路径

bat 复制代码
dir E:\Aflower\obfuscate\work\origin\BOOT-INF\classes\com\flower\ShineApplication.class

必须能看到文件。

第 9 步:生成业务 classes 输入包

必须进入 BOOT-INF\classes 目录再打包:

bat 复制代码
cd /d E:\Aflower\obfuscate\work\origin\BOOT-INF\classes
jar cf E:\Aflower\obfuscate\work\classes\classes-in.jar .

第 10 步:确认 classes-in.jar 路径正确

bat 复制代码
jar tf E:\Aflower\obfuscate\work\classes\classes-in.jar | findstr "com/flower/ShineApplication.class"

必须输出:

text 复制代码
com/flower/ShineApplication.class

先执行到第 10 步,确认有输出后,再进入 ProGuard 执行步骤。

不需要单独显示 LicenseStartupVerifier

你第 10 步已经证明:

text 复制代码
classes-in.jar 的路径结构正确

这是当前最关键的。

但因为 LicenseStartupVerifier 是:

java 复制代码
@Component
public class LicenseStartupVerifier implements CommandLineRunner

属于 Spring 启动阶段 Bean,建议 keep,避免混淆后 Spring 扫描异常。

第 11 步:确认 ProGuard 配置

打开:

text 复制代码
E:\Aflower\obfuscate\proguard-boot-classes.pro

确认至少包含这些关键规则:

pro 复制代码
-keep class com.flower.ShineApplication { *; }
-keep class com.flower.**.*Application { *; }

-keep class com.flower.shine.bootstrap.AflowerRuntimeBootstrap { *; }

-keep class com.flower.shine.LicenseStartupVerifier { *; }

-keepattributes StackMapTable,*Annotation*,Signature,InnerClasses,EnclosingMethod,Exceptions,RuntimeVisibleAnnotations,RuntimeInvisibleAnnotations,RuntimeVisibleParameterAnnotations,RuntimeInvisibleParameterAnnotations

并确认没有:

pro 复制代码
-dontpreverify
-overloadaggressively
-allowaccessmodification

第 12 步:执行 ProGuard

bat 复制代码
java -jar E:\tools\proguard\lib\proguard.jar @E:\Aflower\obfuscate\proguard-boot-classes.pro

执行完成后不要继续下一步,先检查:

第 13 步:检查混淆后的关键类

bat 复制代码
jar tf E:\Aflower\obfuscate\work\classes\classes-obf.jar | findstr "com/flower/ShineApplication.class"
bat 复制代码
jar tf E:\Aflower\obfuscate\work\classes\classes-obf.jar | findstr "com/flower/shine/LicenseStartupVerifier.class"
bat 复制代码
jar tf E:\Aflower\obfuscate\work\classes\classes-obf.jar | findstr "com/flower/shine/bootstrap/AflowerRuntimeBootstrap.class"

这 3 个都必须有输出。

先执行到第 13 步。

很好,继续执行回填原始 SpringBoot Jar 。这次只用 jar uf,不要用 PowerShell 脚本。

第 14 步:复制原始 jar 为混淆输出 jar

bat 复制代码
copy /Y E:\Aflower\obfuscate\flower-shine-original.jar E:\Aflower\obfuscate\flower-shine-obf.jar

第 15 步:清理 patch 目录

bat 复制代码
rmdir /S /Q E:\Aflower\obfuscate\work\patch-classes
rmdir /S /Q E:\Aflower\obfuscate\work\patch-boot
mkdir E:\Aflower\obfuscate\work\patch-classes
mkdir E:\Aflower\obfuscate\work\patch-boot
mkdir E:\Aflower\obfuscate\work\patch-boot\BOOT-INF
mkdir E:\Aflower\obfuscate\work\patch-boot\BOOT-INF\classes

第 16 步:解压混淆后的 classes

bat 复制代码
cd /d E:\Aflower\obfuscate\work\patch-classes
jar xf E:\Aflower\obfuscate\work\classes\classes-obf.jar

第 17 步:复制到 BOOT-INF/classes 结构

bat 复制代码
xcopy /E /I /Y E:\Aflower\obfuscate\work\patch-classes E:\Aflower\obfuscate\work\patch-boot\BOOT-INF\classes

第 18 步:用 jar uf 覆盖原始 jar

bat 复制代码
cd /d E:\Aflower\obfuscate\work\patch-boot
jar uf E:\Aflower\obfuscate\flower-shine-obf.jar BOOT-INF\classes

第 19 步:检查最终 jar

bat 复制代码
jar tf E:\Aflower\obfuscate\flower-shine-obf.jar | findstr "BOOT-INF/classes/com/flower/ShineApplication.class"

必须有输出。

再执行:

bat 复制代码
jar tf E:\Aflower\obfuscate\flower-shine-obf.jar | findstr "BOOT-INF/classes/BOOT-INF"

必须没有输出。

然后再替换发布 jar。

正常。继续最后替换和启动验收。

第 20 步:替换发布 jar

bat 复制代码
copy /Y E:\Aflower\obfuscate\flower-shine-obf.jar E:\My_Dream_2026_4_7\Flower_AI\release\A-Zhao\resources\flower-shine.jar

第 21 步:启动混淆后的 jar

bat 复制代码
cd /d E:\My_Dream_2026_4_7\Flower_AI\release\A-Zhao\resources
java -Daflower.home=E:/Aflower -jar flower-shine.jar

如果能启动,再验收这些接口:

text 复制代码
/login
/license/status
/license/verify
/deploy/check
/deploy/install

启动成功后,再做最后一步反编译抽查:

bat 复制代码
jar tf E:\My_Dream_2026_4_7\Flower_AI\release\A-Zhao\resources\flower-shine.jar | findstr "com/flower/shine/license"

看 license 包里是否已有混淆后的短类名。

相关推荐
云烟成雨TD几秒前
Agent Scope Java 2.x 系列【42】2.0 GA 正式发布:从透明开发迈向智能体系统工程
java·人工智能·agent
猫猫不是喵喵.17 分钟前
SpringBoot自动装配原理
java·spring boot·后端
刘小八18 分钟前
Redis 缓存一致性:一文讲透延时双删原理、并发时序
java·数据库·redis·缓存
吃饱了得干活30 分钟前
从0到1实现消息已读未读:从基础设计到高并发架构
java·后端·架构
r_oo_ki_e_31 分钟前
java微服务
java·微服务
weixin_BYSJ198731 分钟前
django在线图书销售平台---附源码16192
java·javascript·spring boot·python·django·flask·php
糖果店的幽灵32 分钟前
【langgraph 从入门到精通graphApi 篇】Command 与动态流程控制
android·java·数据库·人工智能·langgraph
只会CRUD的码仔34 分钟前
【踩坑记录】Thymeleaf 下拉框设置 disabled 变灰色,但依旧可以点击选择
java
减瓦34 分钟前
Java 8 编译器扩展点
java
_waylau1 小时前
Spring Framework HTTP服务客户端详解
java·后端·网络协议·spring·http·spring cloud