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 包里是否已有混淆后的短类名。

相关推荐
明志数科17 小时前
4D时序标注技术详解:让机器人理解连续动作的数据基础
java·算法·机器人
_qingche18 小时前
H2 数据库到 MySQL 数据迁移
java·数据库·spring boot·mysql·spring·重构·kotlin
可乐ea18 小时前
【知识获取与分享社区项目 | 项目日记第 21 天】索引构建与联想建议:Outbox 增量更新 + Completion Suggester
java·大数据·mysql·elasticsearch·搜索引擎
RainCity18 小时前
Java Swing 自定义组件库分享(十一)
java·笔记·后端
好家伙VCC18 小时前
Qdrant + LangChain 实战:构建毫秒级语义检索服务
java·langchain
AI人工智能+电脑小能手18 小时前
【大白话说Java面试题 第93题】【Mysql篇】第23题:从查找速度来看,聚集索引和非聚集索引哪个更快?
java·开发语言·数据库·mysql·面试
摇滚侠19 小时前
JDBC 基础到高级一套通关!高级篇 28-40
java
Smoothcloud润云19 小时前
5大功能精修,重构AI算力使用体验!
java·人工智能·windows·算法·重构·编辑器·sublime text
我是唐青枫19 小时前
Java MyBatis-Flex 实战指南:从 BaseMapper 到 QueryWrapper 的轻量 ORM 用法
java·开发语言·mybatis
顺风尿一寸20 小时前
Java Native 方法底层原理深度解析:从 JNI 注册到 Native Wrapper 生成
java