1、pom依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.tj.hoo</groupId><artifactId>pro-guard-demo</artifactId><version>0.0.1</version><name>ProGuard-Demo</name><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>${java.version}</source><target>${java.version}</target><compilerVersion>${java.version}</compilerVersion><compilerArgs>--enable-preview</compilerArgs></configuration></plugin><plugin><groupId>com.github.wvengen</groupId><artifactId>proguard-maven-plugin</artifactId><version>2.6.0</version><executions><!--以下配置說明執行mvn的package命令時候,會執行proguard--><execution><phase>package</phase><goals><goal>proguard</goal></goals></execution></executions><configuration><!--輸入jar--><injar>${project.build.finalName}.jar</injar><!--輸出jar--><outjar>${project.build.finalName}.jar</outjar><!--是否混淆--><obfuscate>true</obfuscate><!--配置文件--><proguardInclude>${project.basedir}/proguard.cfg</proguardInclude><!--額外的依賴--><!--<libs><lib></lib></libs>--><!--對輸入jar繼續過濾--><inLibsFilter>!META-INF/**</inLibsFilter><!--輸出路徑配置--><outputDirectory>${project.basedir}/target</outputDirectory><!--混淆的一些細節選項--><!--<options><option></option></options>--></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
2、ProGuard配置
# 指定Java的版本
-target 17
# 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
# 指定不打印有關配置中潛在錯誤或遺漏的注釋,例如類名中的拼寫錯誤或缺少可能有用的選項
-dontnote com.tj.hoo.proguard.demo.ProGuardDemoApplication
# 打印配置信息
-printconfiguration
-keep public class com.tj.hoo.proguard.demo.ProGuardDemoApplication {public static void main(java.lang.String[]);}
3、測試代碼
package com.tj.hoo.proguard.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ProGuardDemoApplication {public static void main(String[] args) {SpringApplication.run(ProGuardDemoApplication.class, args);}}
package com.tj.hoo.proguard.demo.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Collections;
import java.util.Map;@RestController
@RequestMapping("/index")
public class IndexController {@GetMapping("/test01")public Map<String, Object> test01() {return Collections.singletonMap("name", "Jack");}}
4、命令
????????不支持JDK20,否則報錯:[ERROR] Failed to execute goal com.github.wvengen:proguard-maven-plugin:2.6.0:proguard (default) on project pro-guard-demo: Obfuscation failed (result=1) -> [Help 1]
mvn clean package -Dmaven.test.skip=true