pom.xml文件完整配置
<build>
<plugins>
<!--混淆代码插件-->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<proguardVersion>6.2.2</proguardVersion>
<obfuscate>true</obfuscate>
<addMavenDescriptor>true</addMavenDescriptor>
<!--<proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>-->
<!-- proguardInclude和options标签二选一 -->
<options>
<option>-target 1.8</option>
<!-- 默认是开启的,这里关闭shrink,即不删除没有使用的类/成员 -->
<option>-dontshrink</option>
<!-- 默认是开启的,这里关闭字节码级别的优化 -->
<option>-dontoptimize</option>
<!-- 对于类成员的命名的混淆采取唯一策略 -->
<option>-useuniqueclassmembernames</option>
<!--- 混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代 -->
<option>-adaptclassstrings</option>
<option>-ignorewarnings</option>
<!-- 混淆时不生成大小写混合的类名,默认是可以大小写混合 -->
<option>-dontusemixedcaseclassnames</option>
<!-- 此选项将用新的类名替换反射方法调用中的所有字符串。例如,调用 Class.forName('className') -->
<!-- <option>-adaptclassstrings</option> -->
<!-- 此选项将保存所有原始注释等。否则我们将从文件中删除所有内容 -->
<!-- 不混淆所有特殊的类-->
<option>
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
</option>
<!-- 此选项将保存接口中的所有原始名称(无混淆) -->
<option>-keepnames interface **</option>
<!-- 此选项会将所有原始方法参数保存在 -keep 部分中定义的文件中,否则所有参数名称都将被混淆 -->
<option>-keepparameternames</option>
<!-- 保持目录结构-->
<option>-keepdirectories</option>
<!-- 固定几个类不能混淆 -->
<option>-keep class com.geofly.**.entity.* { *; }</option>
<option>-keep class com.geofly.**.mapper.* { *; }</option>
<option>-keep class com.geofly.da4sag.controller.yzt.JsjgController { *; }</option>
<!-- 排除所有public class 和 method-->
<option>-keep public class * { public protected *; }</option>
<!-- <option>-keep @org.springframework.stereotype.Service class *</option> -->
<!-- 此选项将在所有包的所有类中保存所有原始定义的注释 -->
<option>
-keepclassmembers class * {
<!-- @org.springframework.beans.factory.annotation.Autowired *; -->
@org.springframework.beans.factory.annotation.Value *;
}
</option>
</options>
<libs>
<!-- 包括所需的主要 JAVA 库 -->
<lib>${java.home}/lib/rt.jar</lib>
<!-- 如有必要,包括加密 JAVA 库 -->
<lib>${java.home}/lib/jce.jar</lib>
</libs>
</configuration>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>6.2.2</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
proguard.cfg文件必须和pom文件同级
配置文件需要根据项目本身进行修改
# Proguard配置项
# JDK目标版本1.8
-target 1.8
# 默认是开启的,这里关闭shrink,即不删除没有使用的类/成员(删除注释、未被引用代码)
-dontshrink
# 默认是开启的,这里关闭字节码级别的优化(变更代码实现逻辑)
-dontoptimize
# 忽略打包时的警告信息
-ignorewarnings
# 不跳过非公用类文件及成员
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontusemixedcaseclassnames
# 优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
# 混淆类名之后,对使用Class.forName「c1assName,)之类的地方进行相应替代
-adaptclassstrings
# 不混淆所有包名,Spring配置中有大量固定写法的包名
-keeppackagenames
# 确定统一的混淆类的成员名称来增加混淆:一个类中的成员不使用重复的命名,如Student类混淆后不能出现a属性和a方法。
-useuniqueclassmembernames
# 不混淆所有特殊的类:对异常、注解信息在runtime予以保留,不然影响springboot启动
-keepattributes Exceptions,InnerClasses,Signature?Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,SyntheticjEnclosingMethod
# 保留接口类名(两种方式:二选一)
-keepnames interface *
# -keep interface * extends * { *; }
# This option v/ill save all original methods parameters in files defined in -keep sections, otherwise all parameter names will be obfuscate.
#-keepparameternames
#-keepdirectories
-keepclassmembers class * {
@org.springframework.beans.factory.annotation.Autowired *;
@org.springframework.beans.factory.annotation.Qualifier *;
@org.springframework.beans.factory.annotation.Value *;
@org.springframework.beans.factory.annotation.Required *;
@org.springframework.context.annotation.Bean *;
@org.springframework.context.annotation.Primary *;
@org.springframework.boot.context.properties.ConfigurationProperties *;
@org.springframework.boot.context.properties.EnableConfigurationProperties *;
@javax.annotation.PostConstruct *;
@javax.annotation.PreDestroy *;
}
-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.geofly.da4sag.DA4SAGApplication {
public static void main(java.lang.String[]);
}
# 保留程序入口(springboot项目的话,需要保留启动类)
# -keep @org.springframev/ork.boot.autoconfigure.SpringBootApplication class * {*;}
-keep class com.geofly.da4sag.DA4SAGApplication { *; }
# dao保留全部类及类成员,方法命名也不能变,因为与xml文件做了关联
-keep class com.geofly.**.mapper.* { *; }
# 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shir。)会用到大量的set/get映射
-keepclassmembers public class * {
void set*(***);*** get*();
}
# 不对包类的类名进行混淆,但对类中的属性和方法混淆
# 不混淆包下的所有类名,目类中的方法和属性也不混淆
# 混淆指定包下的类此处需要更改
-keep class !com.geofly.**.service.**.* { *; }
# -keep class !com.marydon.controller.**,!com.marydon.*.service.** {
# <fields>;
# 〈methods〉;
#)
#无视跳过警告因为修改代码的过程程序检测到有些文件不能更改就会报警告导致失败如果对自己写的代码比较有信心的话可以直接无视
#不显示警告信息,如果显示则会出现Error无法完成混淆!
-dontwarn *