好,现在从干净状态 重新做一轮。先执行"删除旧混淆遗留文件",避免之前错误的 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 包里是否已有混淆后的短类名。