proguard简单来说是为了防止反编译,更准确的说,是使得代码易读性变差。
第一步:maven pom配置中加入以下:
<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>5.3.3</proguardVersion>
<injar>${project.build.finalName}.jar</injar>
<outjar>${project.build.finalName}-pg.jar</outjar>
<obfuscate>true</obfuscate>
<proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
<libs>
<!-- Include main JAVA library required.-->
<lib>${java.home}/lib/rt.jar</lib>
<!-- Include crypto JAVA library if necessary.-->
<lib>${java.home}/lib/jce.jar</lib>
</libs>
</configuration>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>5.3.3</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>com.geekkeybo.weather.WeatherApplication</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
第二步:在pom同级目录下添加proguard.conf文件:
-target 1.8 ##指定java版本号
-dontshrink ##默认是开启的,这里关闭shrink,即不删除没有使用的类/成员
-dontoptimize ##默认是开启的,这里关闭字节码级别的优化
-useuniqueclassmembernames ##对于类成员的命名的混淆采取唯一策略
-adaptclassstrings ## 混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
-dontusemixedcaseclassnames ## 混淆时不生成大小写混合的类名,默认是可以大小写混合
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod ##对异常、注解信息在runtime予以保留,不然影响springboot启动
-keepclasseswithmembers public class * { public static void main(java.lang.String[]);} ##保留main方法的类及其方法名
-keepclassmembers enum * { *; } ##保留枚举成员及方法
第三步:执行maven命令:
clean
package
执行上述代码后,在target目录下会生成3个文件:
· classes-pg.jar 混淆后的classes文件,里面包含完整的项目结构
· proguard_map.txt 混淆内容的映射
· proguard_seed.txt 参与混淆的类
混淆完成后,将classes-pg.jar解压到应用服务器覆盖原有的classes文件
注意:
问题:我这边使用的springboot2.0版本,在混淆的时候用到了log4j.2.10.0,它使用了jdk9,而proguard不支持所以一直报错。
在网上找了最通用最常见的办法是在proguard.conf中屏蔽java9的api类:
-libraryjars lib\log4j-api-2.10.0.jar(!META-INF/versions/9/**.class,!module-info.class)
-libraryjars lib\log4j-core-2.10.0.jar
-libraryjars lib\log4j-jcl-2.10.0.jar
-libraryjars lib\log4j-web-2.10.0.jar
但是我这边又报出这个错误。
最后,我在pom文件中删除了log4j的依赖,然后混淆通过。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>