集成Maven打包时自动混淆推荐proguard提供了Maven插件集成到Maven中项目打包时自动进行混淆方便快捷局限性Proguard本质上是通过读取jar根据规则生成混淆映射重写源码后输出jar所以对于单模块的打包混淆比较友好配置简单但是多模块项目下打包混淆就比较困难涉及到多模块依赖的问题如A模块方法签名xxxService.save,混淆后变成a.c,不要对各子模块单独混淆。应在最终聚合模块的 package 阶段将所有子模块 JAR 作为 -injars 输入统一执行一次 ProGuard。跨模块公共 API接口、DTO通过 -keep 保留内部实现类正常混淆。1.项目架构JDK17, SpringBoot3单模块2.Pom这里的插件顺序很重要不能更改proguard需要先读取无任何lib依赖的thin jar输出混淆后的thin jar最后通过spring-boot-maven-plugin repackage输出可执行的springboot fat jar如果直接使用spring-boot-maven-plugin打包出fat jarproguard混淆输出后的包结构将被破坏导致无法启动摸索了好久才找到这个问题xxxx..... ${project.artifactId}-${version} org.apache.maven.plugins maven-jar-plugin ${apache.maven.version} default-jar none create-thin-jar prepare-package jar com.github.wvengen proguard-maven-plugin ${proguard.version} prepare-package proguard ${project.build.finalName}.jar ${project.build.finalName}.jar proguard-rules.pro false ${java.home}/lib/jrt-fs.jar com.guardsquare proguard-base ${proguard.base.version} org.springframework.boot spring-boot-maven-plugin com.换成你自己的启动类包名.XXXApplication package repackage 3.proguard混淆规则配置文件 根目录新建文件proguard-rules.pro, 名字可以自定义跟上面Maven的proguardInclude对应即可 根据自己的项目包名结构修改一下下面的保留规则1. 基础 Java 设置关闭 shrink删除未用代码Spring Boot 自动装配会有很多看似未用的类删除必报错-dontshrink关闭 optimize优化JDK 17 配合 Spring Boot 优化极易引发类转换异常-dontoptimize忽略警告第三方库经常会产生一些无害的警告不忽略会导致打包中断-dontwarn保留源文件名和行号方便线上出Bug时根据异常栈反混淆查找问题-keepattributes SourceFile,LineNumberTable保留签名泛型信息MyBatis-Plus 和 HAPI 强依赖泛型反射-keepattributes Signature保留注解-keepattributesAnnotation保留内部类、封闭类JDK 17 新特性支持、异常信息-keepattributes InnerClasses,EnclosingMethod,PermittedSubclasses,Exceptions2. 启动类保留-keep public class com.换成你自己的包名.xxxApplication {public static void main(java.lang.String[]);}3. Spring Boot 核心保留规则-keep org.springframework.stereotype.* class *-keep org.springframework.context.annotation.Configuration class *-keep org.springframework.boot.context.properties.ConfigurationProperties class * {; }-keep org.springframework.web.bind.annotation.class *-keep org.springframework.boot.autoconfigure.SpringBootApplication class *只保留带有这些“生命周期/注入”注解的方法名。其他没有注解的 public/private 方法将被 ProGuard 混淆-keepclassmembers class * {org.springframework.beans.factory.annotation.Autowired *;org.springframework.beans.factory.annotation.Value *;javax.inject.Inject *;org.springframework.context.annotation.Bean *;org.springframework.transaction.annotation.Transactional *;org.springframework.scheduling.annotation.Scheduled;org.springframework.web.bind.annotation.*;jakarta.annotation.PreDestroy *;jakarta.annotation.PostConstruct *;}4. MyBatis-Plus 保留规则保留 MyBatis-Plus 自身代码-keep class com.baomidou.mybatisplus.** { *; }保留 MyBatis 核心代码-keep class org.apache.ibatis.** { *; }实体类绝对不能混淆否则 MyBatis 无法将数据库字段映射到对象-keep class com.换成你自己的包名.entity.** {; }-keep class com.换成你自己的包名.domain.* {; }-keep class com.换成你自己的包名.model.* { *; }DTO / VO如果用在了接口返回值建议不混淆否则前端接收到的 JSON key 会变成 a, b, c-keep class com.换成你自己的包名.dto.** {; }-keep class com.换成你自己的包名.vo.* { *; }Mapper 接口动态代理需要不能混淆-keep interface com.换成你自己的包名.mapper.** { *; }5. 其他通用 Java 库保留序列化相关-keep class * implements java.io.Serializable { *; }枚举类MyBatis-Plus 处理枚举需要-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);}Jackson 序列化/反序列化Spring Boot 默认 JSON 库-keep class com.fasterxml.jackson.** {; }-keepclassmembers class * {com.fasterxml.jackson.annotation.*;}4. 反编译查看打包结果推荐使用进行jd-gui反编译, 轻量化且方便可以看到配置了保留规则的包和类进行了保留其他类则都被混淆imageimage
SpringBoot3 JDK17集成proguard实现混淆打包
发布时间:2026/7/11 20:18:39
集成Maven打包时自动混淆推荐proguard提供了Maven插件集成到Maven中项目打包时自动进行混淆方便快捷局限性Proguard本质上是通过读取jar根据规则生成混淆映射重写源码后输出jar所以对于单模块的打包混淆比较友好配置简单但是多模块项目下打包混淆就比较困难涉及到多模块依赖的问题如A模块方法签名xxxService.save,混淆后变成a.c,不要对各子模块单独混淆。应在最终聚合模块的 package 阶段将所有子模块 JAR 作为 -injars 输入统一执行一次 ProGuard。跨模块公共 API接口、DTO通过 -keep 保留内部实现类正常混淆。1.项目架构JDK17, SpringBoot3单模块2.Pom这里的插件顺序很重要不能更改proguard需要先读取无任何lib依赖的thin jar输出混淆后的thin jar最后通过spring-boot-maven-plugin repackage输出可执行的springboot fat jar如果直接使用spring-boot-maven-plugin打包出fat jarproguard混淆输出后的包结构将被破坏导致无法启动摸索了好久才找到这个问题xxxx..... ${project.artifactId}-${version} org.apache.maven.plugins maven-jar-plugin ${apache.maven.version} default-jar none create-thin-jar prepare-package jar com.github.wvengen proguard-maven-plugin ${proguard.version} prepare-package proguard ${project.build.finalName}.jar ${project.build.finalName}.jar proguard-rules.pro false ${java.home}/lib/jrt-fs.jar com.guardsquare proguard-base ${proguard.base.version} org.springframework.boot spring-boot-maven-plugin com.换成你自己的启动类包名.XXXApplication package repackage 3.proguard混淆规则配置文件 根目录新建文件proguard-rules.pro, 名字可以自定义跟上面Maven的proguardInclude对应即可 根据自己的项目包名结构修改一下下面的保留规则1. 基础 Java 设置关闭 shrink删除未用代码Spring Boot 自动装配会有很多看似未用的类删除必报错-dontshrink关闭 optimize优化JDK 17 配合 Spring Boot 优化极易引发类转换异常-dontoptimize忽略警告第三方库经常会产生一些无害的警告不忽略会导致打包中断-dontwarn保留源文件名和行号方便线上出Bug时根据异常栈反混淆查找问题-keepattributes SourceFile,LineNumberTable保留签名泛型信息MyBatis-Plus 和 HAPI 强依赖泛型反射-keepattributes Signature保留注解-keepattributesAnnotation保留内部类、封闭类JDK 17 新特性支持、异常信息-keepattributes InnerClasses,EnclosingMethod,PermittedSubclasses,Exceptions2. 启动类保留-keep public class com.换成你自己的包名.xxxApplication {public static void main(java.lang.String[]);}3. Spring Boot 核心保留规则-keep org.springframework.stereotype.* class *-keep org.springframework.context.annotation.Configuration class *-keep org.springframework.boot.context.properties.ConfigurationProperties class * {; }-keep org.springframework.web.bind.annotation.class *-keep org.springframework.boot.autoconfigure.SpringBootApplication class *只保留带有这些“生命周期/注入”注解的方法名。其他没有注解的 public/private 方法将被 ProGuard 混淆-keepclassmembers class * {org.springframework.beans.factory.annotation.Autowired *;org.springframework.beans.factory.annotation.Value *;javax.inject.Inject *;org.springframework.context.annotation.Bean *;org.springframework.transaction.annotation.Transactional *;org.springframework.scheduling.annotation.Scheduled;org.springframework.web.bind.annotation.*;jakarta.annotation.PreDestroy *;jakarta.annotation.PostConstruct *;}4. MyBatis-Plus 保留规则保留 MyBatis-Plus 自身代码-keep class com.baomidou.mybatisplus.** { *; }保留 MyBatis 核心代码-keep class org.apache.ibatis.** { *; }实体类绝对不能混淆否则 MyBatis 无法将数据库字段映射到对象-keep class com.换成你自己的包名.entity.** {; }-keep class com.换成你自己的包名.domain.* {; }-keep class com.换成你自己的包名.model.* { *; }DTO / VO如果用在了接口返回值建议不混淆否则前端接收到的 JSON key 会变成 a, b, c-keep class com.换成你自己的包名.dto.** {; }-keep class com.换成你自己的包名.vo.* { *; }Mapper 接口动态代理需要不能混淆-keep interface com.换成你自己的包名.mapper.** { *; }5. 其他通用 Java 库保留序列化相关-keep class * implements java.io.Serializable { *; }枚举类MyBatis-Plus 处理枚举需要-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);}Jackson 序列化/反序列化Spring Boot 默认 JSON 库-keep class com.fasterxml.jackson.** {; }-keepclassmembers class * {com.fasterxml.jackson.annotation.*;}4. 反编译查看打包结果推荐使用进行jd-gui反编译, 轻量化且方便可以看到配置了保留规则的包和类进行了保留其他类则都被混淆imageimage