SpringBoot3 JDK17集成proguard实现混淆打包的两种方案

 更新时间:2026年07月09日 14:13:48   作者:xiaoyu01  
本文分享两种主流方案讲解SpringBoot3 JDK17集成proguard实现混淆打包,重点推荐Maven集成方式,实现自动化混淆,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

最近一个私有化部署的项目需要实现打包混淆,防止被破解,网上找了一圈没有好的解决方案,遂写一篇文章分享一下

Proguard

目前java打包混淆主流,比较成熟的方案都是使用Proguard来实现,有2种实现方案

  • 使用Proguard混淆工具
    • 这种方案需要下载proguard混淆工具,自己打完包以后再使用工具进行混淆,不太方便,人员一多,交付时可能就忘了混淆
  • 集成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 jar,proguard混淆输出后的包结构将被破坏,导致无法启动,摸索了好久才找到这个问题

<properties>
  <apache.maven.version>3.5.0</apache.maven.version>
  <proguard.version>2.7.0</proguard.version>
  <proguard.base.version>7.6.1</proguard.base.version>
</properties>
<dependencies>
  xxxx.....
</dependencies>
<build>
  <finalName>${project.artifactId}-${version}</finalName>
  <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>${apache.maven.version}</version>
          <executions>
              <execution>
                  <id>default-jar</id>
                  <phase>none</phase>
              </execution>
              <execution>
                  <id>create-thin-jar</id>
                  <phase>prepare-package</phase>
                  <goals>
                      <goal>jar</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
      <plugin>
          <groupId>com.github.wvengen</groupId>
          <artifactId>proguard-maven-plugin</artifactId>
          <version>${proguard.version}</version>
          <executions>
              <execution>
                  <phase>prepare-package</phase>
                  <goals>
                      <goal>proguard</goal>
                  </goals>
              </execution>
          </executions>
          <configuration>
              <injar>${project.build.finalName}.jar</injar>
              <outjar>${project.build.finalName}.jar</outjar>
              <proguardInclude>proguard-rules.pro</proguardInclude>
              <addMavenDescriptor>false</addMavenDescriptor>
              <libs>
                  <lib>${java.home}/lib/jrt-fs.jar</lib>
              </libs>
          </configuration>
          <dependencies>
              <dependency>
                  <groupId>com.guardsquare</groupId>
                  <artifactId>proguard-base</artifactId>
                  <version>${proguard.base.version}</version>
              </dependency>
          </dependencies>
      </plugin>
      <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <configuration>
              <mainClass>com.换成你自己的启动类包名.XXXApplication</mainClass>
          </configuration>
          <executions>
              <execution>
                  <phase>package</phase>
                  <goals>
                      <goal>repackage</goal>
                  </goals>
              </execution>
          </executions>
      </plugin>
  </plugins>
</build>

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
# 保留注解
-keepattributes *Annotation*
# 保留内部类、封闭类(JDK 17 新特性支持)、异常信息
-keepattributes InnerClasses,EnclosingMethod,PermittedSubclasses,Exceptions
# ==========================================
# 2. 启动类保留
# ==========================================
-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反编译, 轻量化且方便
可以看到配置了保留规则的包和类进行了保留,其他类则都被混淆

到此这篇关于SpringBoot3 JDK17集成proguard实现混淆打包的两种方案的文章就介绍到这了,更多相关SpringBoot 集成proguard混淆打包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决SpringBoot引用别的模块无法注入的问题

    解决SpringBoot引用别的模块无法注入的问题

    这篇文章主要介绍了解决SpringBoot引用别的模块无法注入的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 基于CopyOnWriteArrayList并发容器(实例讲解)

    基于CopyOnWriteArrayList并发容器(实例讲解)

    下面小编就为大家带来一篇基于CopyOnWriteArrayList并发容器(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • SpringBoot中的自定义FailureAnalyzer详解

    SpringBoot中的自定义FailureAnalyzer详解

    这篇文章主要介绍了SpringBoot中的自定义FailureAnalyzer详解,FailureAnalyzer是一种很好的方式在启动时拦截异常并将其转换为易读的消息,并将其包含在FailureAnalysis中, Spring Boot为应用程序上下文相关异常、JSR-303验证等提供了此类分析器,需要的朋友可以参考下
    2023-12-12
  • springboot获取真实ip地址的方法实例

    springboot获取真实ip地址的方法实例

    在使用springboot时,需要获取访问客户端的IP地址,所以下面这篇文章主要给大家介绍了关于springboot获取真实ip地址的相关资料,需要的朋友可以参考下
    2022-06-06
  • springboot打包jar和war包的教程图解

    springboot打包jar和war包的教程图解

    这篇文章主要介绍了springboot打包jar和war包的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Spring解决泛型擦除的思路详解

    Spring解决泛型擦除的思路详解

    这篇文章主要介绍了Spring解决泛型擦除的思路,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • 浅谈Java多进程程序的运行模式

    浅谈Java多进程程序的运行模式

    这篇文章主要介绍了浅谈Java多进程程序的运行模式,包括对进程阻塞问题的讨论等,需要的朋友可以参考下
    2015-11-11
  • Spring Boot使用线程池创建多线程的完整示例

    Spring Boot使用线程池创建多线程的完整示例

    在 Spring Boot 2 中,可以使用 @Autowired 注入 线程池(ThreadPoolTaskExecutor 或 ExecutorService),从而管理线程的创建和执行,以下是使用 @Autowired 方式注入线程池的完整示例,感兴趣的朋友一起看看吧
    2025-03-03
  • 使用spring框架实现数据库事务处理方式

    使用spring框架实现数据库事务处理方式

    这篇文章主要介绍了使用spring框架实现数据库事务处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 使用maven切换镜像源方式

    使用maven切换镜像源方式

    这段文章主要讲述了在Maven项目构建时遇到中央仓库暂停更新的问题,并提出了解决方案,包括修改settings.xml文件中的镜像源设置;同时建议可以切换至华为仓库以提高构建速度
    2026-06-06

最新评论