springboot项目中,使用ProGuard 对代码进行混淆

使用maven作为构建工具 , 在build中添加如下内容

 <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
        </resources>
        <!-- maven 打包 命令 (mvn clean package) -->
        <finalName>PianoBackstage</finalName>
        <!-- 打包 插件 start -->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- Application 启动类配置 -->
                    <mainClass>com.ninePavilion.PianoBackstageApplication</mainClass>
                </configuration>
            </plugin>
            <!-- java 混淆器插件 -->
            <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.3.1</version>
                <executions>
                    <execution>
                        <!-- 混淆时刻:这是在打包时的阶段 -->
                        <phase>package</phase>
                        <goals>
                            <!-- 使用插件中的什么功能:混淆 -->
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- ProGuard 版本 -->
<!--                    <proguardVersion>${proguard.version}</proguardVersion>-->
                     <proguardVersion>6.2.2</proguardVersion>

                    <!-- 是否混淆 -->
                    <obfuscate>true</obfuscate>

                    <!-- 引入配置文件,这里填你的配置文件所在路径,一般你可以放在proguard.cfg所在的目录 -->
                    <proguardInclude>${project.basedir}/src/main/resources/proguard.cfg</proguardInclude>

                    <!-- 混淆时需要引用的java库,这些库的路径基本不会发生变化 -->
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                        <lib>${java.home}/lib/jce.jar</lib>
                    </libs>

                    <!-- 当<injar>的值为:classes时,可以给含有该路径的作用:相关混淆需要只为指定目录下的class文件生成 -->
                    <!-- <infilter>com/marydon/**/</infilter> -->
                    <!-- 需要此选项的jar或class目录,也就是说:选择对什么东西进行加密 -->
<!--                    <injar>classes</injar>-->
                     <injar>${project.build.finalName}.jar</injar>

                    <!-- class 混淆输出的jar包,说明:这个输出出来的jar包不可用,下面会讲 -->
<!--                    <outjar>${project.build.finalName}.pd.jar</outjar>-->
                    <outjar>${project.build.finalName}.jar</outjar>
                    <!-- 输出目录 -->
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>

                <dependencies>
                    <dependency>
                        <groupId>net.sf.proguard</groupId>
                        <artifactId>proguard-base</artifactId>
<!--                        <version>${proguard.version}</version>-->
                         <version>6.2.2</version>
                        <scope>runtime</scope>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
        <!-- 打包插件 end -->
    </build>

如果引入了上述内容,maven不爆红,且出现了这个信息,继续往下执行下面操作
在这里插入图片描述

2.在项目的resources 目录下,创建文件 proguard.cfg

在这里插入图片描述
内容展示

# ProGuard 配置项
# JDK目标版本:1.8
-target 1.8

# 默认情况下开启 shrink,即不删除没被使用的类/成员(删除注释、未被引用代码)
-dontshrink

# 忽略优化项,这里是清除字节码级别的优化(变更代码实现逻辑)
-dontoptimize

# 允许混淆日志
-ignorewarnings

# 保留公共类和成员
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers

# 不使用大小写混合的类名
-dontusemixedcaseclassnames

# 允许类合并
-allowaccessmodification

# 将类名字符串如 Class.forName("className") 之类的地方进行相应替代
-adaptclassstrings

# 不要删除不被引用的类,Spring Boot 项目里尽量不要删除包含
-dontnote

# 设置保留所有指定的注解成员和注解参数。一个接口内的成员不使用重新的命名,如 Student类里不出现"成员"和方法名。
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod

# 保留接口类(两种方式:二选一)
-keep interface * extends * { }

# This option will save all original method parameters in files defined in -keep sections, otherwise all parameter names will be obfuscate.
# 保存方法参数名
-keepparameternames

# 保存包目录
-keepdirectories

# 保留 Spring 注解
-keepclassmembers class * {
    @org.springframework.beans.factory.annotation.Autowired *;
#    @org.springframework.beans.factory.annotation.Service *;
    @org.springframework.beans.factory.annotation.Value *;
    @org.springframework.web.bind.annotation.PostMapping *;
    @org.springframework.web.bind.annotation.GetMapping *;
    @org.springframework.web.bind.annotation.DeleteMapping *;
    @org.springframework.web.bind.annotation.RestController *;
    @javax.annotation.Resource *;
}

# 保留类并实现接口
-keep class * implements java.io.Serializable { *; }
-keep class * implements org.springframework.boot.CommandLineRunner { *; }

# 保留枚举的所有方法(三选一)
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembers enum * { *; }

# 保留带有注解的main方法
-keep class com.ninePavilion.PianoBackstageApplication {
    public static void main(java.lang.String[]);
}

# 保留配置类(springboot项目的需要,非常重要的配置项)
-keep @org.springframework.boot.autoconfigure.SpringBootApplication class * { *; }
-keep class  com.ninePavilion.PianoBackstageApplication { *; }
-keep class * implements org.springframework.boot.ApplicationRunner { *; }
-keepclassmembers class * {
    @org.springframework.beans.factory.annotation.Autowired *;
}

# 保留所有包含"set"或"get"的方法名(例如shiro)会用到大量的get/set映射
# 不要删除下面的方法,自动的get和set方法的兼容
-keepclassmembers class * {
    public void set*();
    public void get*();
}

# 不要混淆下面的内容,其中注释包含
#-keep class com.ninePavilion.pianoBackstage.service.* { *; }
#-keep class com.ninePavilion.pianoBackstage.controller.*

# 使用注意事项 因为加密的代码很多注释很容易对有特殊写法的类不会被改动会报错导致生成报文失败 如果对自己的代码没有信心的话可以无视
# 不要大面积使用某些类出现Error无法完成混淆。
#-dontwarn *

3. 执行maven clean package 后,会出现下面的jar包

在这里插入图片描述

4. 最后,执行java -jar xxxx 看混淆后的jar包是否能够被正常执行访问

附上参考文档链接:
https://www.cnblogs.com/Marydon20170307/p/13847588.html

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐