springboot 工程使用proguard混淆

Maven 构建的 Spring Boot 项目中使用 ProGuard 进行代码混淆时,需要正确配置 Maven 插件和 ProGuard 的混淆规则。由于 Spring Boot 项目通常会依赖大量的反射机制和动态代理,因此必须特别小心确保这些部分在混淆过程中不会被破坏。

步骤 1:添加 ProGuard 插件

你需要在 pom.xml 中配置 ProGuard Maven 插件,以便在构建过程中自动执行代码混淆。

首先,确保你的 pom.xml 文件中包含了 ProGuard 插件的依赖和配置。

xml 复制代码
		<dependency>
            <groupId>com.guardsquare</groupId>
            <artifactId>proguard-base</artifactId>
            <version>7.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.guardsquare</groupId>
            <artifactId>proguard-retrace</artifactId>
            <version>7.1.1</version>
        </dependency>
1.2 pom.xml 中添加 ProGuard 插件
xml 复制代码
<build>
        <plugins>
            <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.6.0</version>
                <executions>
                    <!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->
                    <injar>${project.build.finalName}.jar</injar>
                    <!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->
                    <outjar>${project.build.finalName}.jar</outjar>
                    <!-- 是否混淆 默认是true -->
                    <obfuscate>true</obfuscate>
                    <!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->
                    <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
                    <!-- 额外的jar包,通常是项目编译所需要的jar -->
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                        <lib>${java.home}/lib/jce.jar</lib>
                        <lib>${java.home}/lib/jsse.jar</lib>
                    </libs>
                    <!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->
                    <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
                    <!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->
                    <outputDirectory>${project.basedir}/target</outputDirectory>
                    <!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->
                    <options>
                        <!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->
                    </options>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring.boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <mainClass>com.example.proguard.ProguardApplication</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
配置项说明:
  • injar:指定输入的 JAR 文件,通常是构建后的可执行 JAR 文件。
  • outjar:指定输出的混淆后的 JAR 文件。
  • options:ProGuard 的混淆规则,包含了一些必要的保留规则,避免 Spring 和 Spring Boot 的关键类被混淆。

步骤 2:创建 ProGuard 混淆规则文件

为了确保 Spring Boot 项目的特性在混淆后能够正常运行,你需要配置 ProGuard 的规则文件。将这些规则放入项目的某个目录(如 proguard.cfg),并在 pom.xml 中引用。

2.1 创建 proguard.cfg 文件

src/main/resources 目录下创建一个 proguard-rules.pro 文件,并添加以下内容:

pro 复制代码
#指定Java的版本
-target 1.8
#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
-dontshrink
#是否关闭字节码级别的优化,如果不开启则设置如下配置
-dontoptimize
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
# 对于类成员的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
#混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
-adaptclassstrings

#对异常、注解信息予以保留
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# 此选项将保存接口中的所有原始名称(不混淆)-->
-keepnames interface ** { *; }
# 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
#-keep interface * extends * { *; }
#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
-keepparameternames
# 保留枚举成员及方法
-keepclassmembers enum * { *; }
# 不混淆所有类,保存原始定义的注释-
-keepclassmembers class * {
                        @org.springframework.context.annotation.Bean *;
                        @org.springframework.beans.factory.annotation.Autowired *;
                        @org.springframework.beans.factory.annotation.Value *;
                        @org.springframework.stereotype.Service *;
                        @org.springframework.stereotype.Component *;
                        }

#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
-keep public class com.example.proguard.ProguardApplication {
        public static void main(java.lang.String[]);
    }

步骤 3:构建项目并执行 ProGuard 混淆

在配置好 ProGuard 插件和混淆规则后,你可以执行构建命令并让 ProGuard 自动处理混淆过程。

3.1 执行 Maven 构建
bash 复制代码
mvn clean package

执行完构建命令后,ProGuard 将会根据配置对生成的 JAR 文件进行混淆,并输出一个混淆后的 JAR 文件。混淆后的文件将保存在目标目录下(通常是 target/)。

你可以在目标目录中找到如下的文件:

├── proguard-0.0.1.jar
├── proguard-0.0.1.jar.original
├── proguard-0.0.1_proguard_base.jar
├── proguard_map.txt
├── proguard_seed.txt
3.2 验证混淆后的 JAR 文件

为了确保混淆后项目仍然能够正常运行,特别是 Spring Boot 的应用程序,你需要测试生成的混淆后的 JAR 文件是否能够正常启动:

bash 复制代码
java -jar proguard-0.0.1.jar

如果没有问题,则说明混淆过程成功。可以看到堆栈输出中已经混淆

3.3 查看混淆后的 JAR 文件

使用GUI 工具可以看到已经代码已经混淆

总结

通过上面的步骤,你可以在 Maven 构建的 Spring Boot 项目中使用 ProGuard 进行代码混淆。关键点包括:

  • 配置 proguard-maven-plugin 插件,并设置输入和输出 JAR 文件。
  • 添加必要的保留规则,确保 Spring Boot 特性如反射、代理和注解能够正常工作。
  • 混淆完成后,测试生成的 JAR 文件,确保应用程序能够正常启动。

通过这些步骤,你就可以在 Spring Boot 项目中实现代码混淆,提高安全性并减小 JAR 文件的大小。

相关推荐
小汤猿人类19 分钟前
nacos-gateway动态路由
java·前端·gateway
GraduationDesign24 分钟前
基于SpringBoot的在线文档管理系统的设计与实现
java·spring boot·后端
TANGLONG22230 分钟前
【初阶数据结构与算法】八大排序之非递归系列( 快排(使用栈或队列实现)、归并排序)
java·c语言·数据结构·c++·算法·蓝桥杯·排序算法
言之。36 分钟前
【Java】面试题 并发安全 (1)
java·开发语言
m0_7482345237 分钟前
2025最新版Java面试八股文大全
java·开发语言·面试
van叶~43 分钟前
仓颉语言实战——2.名字、作用域、变量、修饰符
android·java·javascript·仓颉
张声录11 小时前
【ETCD】【实操篇(十九)】ETCD基准测试实战
java·数据库·etcd
xiaosannihaiyl241 小时前
Scala语言的函数实现
开发语言·后端·golang
鱼香鱼香rose1 小时前
面经hwl
java·服务器·数据库
新手小袁_J1 小时前
java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigur
java·开发语言·spring·spring cloud·bootstrap·maven·mybatis