网上大多能找到的关于Proguard资料非常多,但大多都是用于Android项目加固,对于后端Spring架构实用能搭成功的确非常少,本文就笔者亲测可用的springcloud环境下开发后端sdk使用Proguard过程做下笔记,不啰嗦,直接上Code。
一、pom.xml配置
<!-- ProGuard混淆插件 --><plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.11</version>
<executions>
<execution>
<phase>package</phase><!-- 混淆时刻,这里是打包的时候混淆 -->
<goals>
<goal>proguard</goal> <!-- 使用插件的什么功能,当然是混淆 -->
</goals>
</execution>
</executions>
<configuration>
<attach>true</attach> <!-- 是否将生成的PG文件安装部署 -->
<obfuscate>true</obfuscate> <!-- 是否混淆 --> <attachArtifactClassifier>pg</attachArtifactClassifier><!-- 指定生成文件分类 -->
<options>
<option>-target 1.8</option><!-- JDK目标版本1.8 -->
<option>-dontshrink</option><!-- 不做收缩(删除注释、未被引用代码) -->
<option>-dontoptimize</option><!-- 不做优化(变更代码实现逻辑) -->
<option>-dontskipnonpubliclibraryclasses</option><!-- 不路过非公用类文件及成员 -->
<option>-dontskipnonpubliclibraryclassmembers</option>
<option>-allowaccessmodification</option><!-- 优化时允许访问并修改有修饰符的类和类的成员 -->
<option>-useuniqueclassmembernames</option><!-- 确定统一的混淆类的成员名称来增加混淆 -->
<!-- 不混淆所有包名,本人测试混淆后WEB项目问题实在太多,毕竟Spring配置中有大量固定写法的包名 -->
<option>-keeppackagenames</option>
<!-- [*** 非常重要,不加生成jar的目录结构spring将扫描不到(同时被spring的@Configuration注解的类不能混淆, 原因未知 ???) ***] -->
<option>-keepdirectories</option>
<!-- 不混淆所有特殊的类 -->
<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
<!-- 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射 -->
<option>-keepclassmembers public class * {void set*(***);*** get*();}</option>
<!-- 不混淆的包下的类名、或方法配置 -->
<option>-keep class com.wl4g.devops.scm.client.config.*Configuration { *; }</option>
<option>-keep class com.wl4g.devops.scm.client.configure.RefreshBean { *; }</option>
<option>-keep class com.wl4g.devops.scm.client.configure.BeanCurrentlyConfigureAspect { *; }</option>
<option>-keep class com.wl4g.devops.scm.client.indicator.** { *; }</option> <option>-keep class com.wl4g.devops.scm.client.metrics.** { *; }</option>
<option>-keep class com.wl4g.devops.scm.client.store.** { *; }</option>
<option>-keep class com.wl4g.devops.scm.client.utils.** { *; }</option>
</options> <outjar>${project.artifactId}-${project.version}-pg.jar</outjar>
<!-- 添加依赖,可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 -->
<libs>
<lib>${java.home}/lib/rt.jar</lib>
</libs>
<addMavenDescriptor>true</addMavenDescriptor> <!-- 不添加则不会将pom.xml打包进去 -->
<!-- 加载文件的过滤器,就是你的工程目录了 -->
<!-- <inFilter>com/wl4g/devops/scm/client/**</inFilter> -->
<!-- 对什么东西进行加载,这里仅有classes成功,毕竟你也不可能对配置文件及JSP混淆吧 --> <injar>classes</injar>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration><!-- 输出目录 -->
</plugin>
二、FQA
1. Proguard混淆代码导致Spring自动装配失败?
举例说明:
这是没加“-keepdirectories”的解压输出
inflated: META-INF/MANIFEST.MF
inflated: abc/service/Service.class
inflated: test/rest/controller/Controller.class
inflated: test/rest/controller/ServiceImpl.class
inflated: META-INF/maven/test/rest/pom.xml
inflated: META-INF/maven/test/rest/pom.properties
2.加上“-keepdirectories”之后解压输出
created: META-INF/inflated: META-INF/MANIFEST.MF
created: abc/created: abc/service/
created: test/
created: test/rest/
created: test/rest/controller/
inflated: abc/service/Service.class
inflated: test/rest/controller/Controller.class
inflated: test/rest/controller/ServiceImpl.class
created: META-INF/maven/
created: META-INF/maven/test/
created: META-INF/maven/test/rest/
inflated: META-INF/maven/test/rest/pom.xml
inflated: META-INF/maven/test/rest/pom.properties
2. 执行clean install -DskipTests打包后解压jar包无maven的pom.xml文件?
增加如下配置:
<addMavenDescriptor>true</addMavenDescriptor>
网友评论