当先锋百科网

首页 1 2 3 4 5 6 7

关于maven代码混淆插件配置

参考链接:

  • 代码混淆1:https://blog.csdn.net/piaoyunlive/article/details/129676378
  • 代码混淆2:https://blog.csdn.net/m0_57042151/article/details/127507097

1、在pom.xml文件中添加代码混淆插件proguard-maven-plugin

<build>
        <plugins>
            <!-- 代码混淆插件 -->
            <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.6.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
                </configuration>
            </plugin>

            <!-- maven打包插件,可用于指定java -jar命令启动后的main类 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <!-- 这里修改成项目工程中的main类!!! -->
                            <mainClass>com.drgn.SecurityApplication</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

注意proguard-maven-pluginpring-boot-maven-plugin两个插件的顺序不能颠倒,否则会报错!!!

2、在工程根目录下添加proguard.cfg配置文件

# 指定Java的版本
-target 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.drgn.SecurityApplication { # 这里修改成项目工程中的main类!!!
        public static void main(java.lang.String[]);
    }

3、执行如下命令,打包

mvn clean package -DskipTests

4、下载Java反编译工具JD-GUI

参考链接:https://blog.csdn.net/BASK2311/article/details/127567314

下载链接为:http://java-decompiler.github.io/,选择适合的版本进行下载安装。

在这里插入图片描述
​ 我下载的是windows版本,下载后的文件为jd-gui-windows-1.6.6.zip,解压后,运行jd-gui.exe即可。
在这里插入图片描述

5、导入jar包,校验混淆情况

在jd-gui中导入maven打包好的jar包,jar包存放在工程项目中的target文件夹中。

如下,可以看到代码做了一定程度的混淆,混淆效果自行调整。
在这里插入图片描述

6、运行jar包(关键)

参考:https://developer.huawei.com/consumer/cn/forum/topic/0202750575839150382?fid=23

当前工程是spring-boot工程,虽然代码做了混淆,但是为防止混淆后的bean名冲突,需要通过运行java -jar xx.jar命令来确定jar包是否可用。如能流畅运行,则确定代码混淆真正成功;否则需要调整bean名避免冲突。