需求说明
IDEA下需要对一个普通的SpringWeb项目(使用的是Maven构建)的编译出来的class文件进行混淆,准备使用proguard来进行。
实现
我找到了一个使用proguard的maven编译插件,项目地址是:https://github.com/wvengen/proguard-maven-plugin
首先修改pom.xml,在project下,使用如下内容(配置文件有注释,可根据自己实际情况做调整):
<build> <plugins> <!-- ProGuard混淆插件--> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <version>2.5.3</version> <executions> <execution> <!-- 混淆时刻,这里是打包的时候混淆--> <phase>package</phase> <goals> <!-- 使用插件的什么功能,当然是混淆--> <goal>proguard</goal> </goals> </execution> </executions> <configuration> <!-- 是否将生成的PG文件安装部署--> <attach>true</attach> <!-- 是否混淆--> <obfuscate>true</obfuscate> <!-- 指定生成文件分类 --> <attachArtifactClassifier>pg</attachArtifactClassifier> <options> </options> <outjar>${project.build.finalName}-pg.jar</outjar> <!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 --> <libs> <!-- ${java.home}/jre/lib/rt.jar--> <lib>/Users/User/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home/jre/lib/rt.jar</lib> </libs> <!-- 加载文件的过滤器,就是你的工程目录了--> <!-- <inFilter>com/example/test/shiro_spring/**</inFilter>--> <injar>classes</injar> <!-- 输出目录--> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> </plugin> </plugins> </build>
接下来配置proguard的混淆规则,在pom.xml的同级目录下新增proguard.conf,内容如下(内容都有注释,可以根据自己的实际情况做修改):
# 忽略所有警告,否则有警告的时候混淆会停止 -ignorewarnings # JDK目标版本11,或者1.8这类 -target 11 # 不做收缩(删除注释、未被引用代码) -dontshrink # 不做优化(变更代码实现逻辑) -dontoptimize # 不路过非公用类文件及成员 -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers # 优化时允许访问并修改有修饰符的类和类的成员 -allowaccessmodification # 确定统一的混淆类的成员名称来增加混淆 -useuniqueclassmembernames # 不混淆所有包名,本人测试混淆后WEB项目问题实在太多,毕竟Spring配置中有大量固定写法的包名 -keeppackagenames # 不混淆局部变量名 -keepparameternames # 不混淆所有特殊的类 LocalVariable*Table, -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,Synthetic,EnclosingMethod # 不混淆包下的所有类名 -keep class com.example.test.** { <methods>; } -keep class com.example.test.service.** { <methods>; } -keep class com.example.test.dao.** { <methods>; } # 不混淆quartz包下的所有类名,且类中的方法也不混淆 -keep class com.example.test.quartz.** { <methods>; } # 不混淆model包中的所有类以及类的属性及方法,实体包,混淆了会导致ORM框架及前端无法识别 -keep class com.example.test.entity.** {*;} # 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射 -keepclassmembers public class * {void set*(***);*** get*();} # 保持类protected不被混淆 -keep public class * { public protected <fields>;public protected <methods>; }
编译混淆结果
以上就是所有的配置了。
IDEA下双击proguard:proguard就可以生成混淆后的jar(在项目的target下生成了classes-pg.jar)了,可以使用jd-gui打开查看混淆的效果
实际如果要部署到tomcat下,可以把classes-pg.jar用压缩软件解开,然后里面的classes文件夹复制到tomcat的相关文件夹下(一般是webapps/ROOT/WEB-INF/下)
另外如果是SpringBoot下用proguard混淆会更简单一些,详见:https://blog.terrynow.com/2022/11/19/proguard-obfuse-springboot-maven-jar-implement-and-samples/
文章评论