使用proguard對maven構建的springboot項目進行混淆方式
1,配置混淆的問題
配置混淆的時候可能會報很多版本錯,包括但不限于java版本不對,springboot版本不對,log4j版本不對。。。。。
其實只要proguard版本上去了就行,得自己下一個高版本的proguard.jar.
由于proguard混淆貌似不能指定混淆的類名在basePackages下面類名混淆后唯一,不同包名經常有a.class,b.class,c.class之類重復的類名,因此spring容器初始化bean的時候會報錯,因為spring不允許不同包下類名一樣,我們需要改變spring的bean的命名策略來解決這個問題 (見步驟2.4)
dao和domain層不要混淆
2,配置過程
2.1 首先下載
下載proguard 6.2.2,其他版本也行,那就把pom的配置改一改版本號,然后在和pom同一級的lib下將proguard文件放進去,千萬別放在src下,不然等于讓這個jar包混淆自己,鐵定報錯
2.2 maven pom配置中加入以下
<!-- ProGuard混淆插件-->
<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>
<!-- 是否將生成的PG文件安裝部署-->
<attach>true</attach>
<!-- 是否混淆-->
<obfuscate>true</obfuscate>
<!-- 指定生成文件分類 -->
<attachArtifactClassifier>pg</attachArtifactClassifier>
<proguardInclude>${basedir}/proguard.conf</proguardInclude>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
<lib>${java.home}/lib/jce.jar</lib>
<lib>${java.home}/lib/jsse.jar</lib>
</libs>
<!-- 對什么東西進行加載,這里僅有classes成功,不可能對配置文件及JSP混淆吧-->
<injar>classes</injar>
<outjar>${project.build.finalName}-pg.jar</outjar>
<!-- 輸出目錄-->
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
<dependencies>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>6.2.2</version>
<scope>system</scope>
<systemPath>${basedir}/lib/proguard.jar</systemPath>
</dependency>
</dependencies>
</plugin>2.3 在pom同級目錄下添加proguard.conf文件
# 忽略所有警告,否則有警告的時候混淆會停止
-ignorewarnings
# JDK目標版本1.8
-target 1.8
# 不做收縮(刪除注釋、未被引用代碼)
-dontshrink
# 不做優(yōu)化(變更代碼實現(xiàn)邏輯)
-dontoptimize
# 不路過非公用類文件及成員
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
## 混淆時不生成大小寫混合的類名,默認是可以大小寫混合
-dontusemixedcaseclassnames
# 優(yōu)化時允許訪問并修改有修飾符的類和類的成員
-allowaccessmodification
# 確定統(tǒng)一的混淆類的成員名稱來增加混淆
-useuniqueclassmembernames
# 不混淆所有包名,本人測試混淆后WEB項目問題實在太多,畢竟Spring配置中有大量固定寫法的包名
-keeppackagenames
# 不混淆局部變量名
-keepparameternames
# 不刪除注解
-keepattributes *Annotation*
# 不混淆所有特殊的類 LocalVariable*Table,
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,Synthetic,EnclosingMethod
# 不混淆所有的set/get方法,畢竟項目中使用的部分第三方框架(例如Shiro)會用到大量的set/get映射
-keepclassmembers public class * {void set*(***);*** get*();}
##對異常、注解信息在runtime予以保留,不然影響springboot啟動
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
##保留main方法的類及其方法名
-keepclasseswithmembers public class * { public static void main(java.lang.String[]);}
##保留枚舉成員及方法
-keepclassmembers enum * { *; }
# 不混淆泛型
-keepattributes Signature
#?。。。。。?!不混淆dao和domain?。。。。?
-keep class com.dingding.managerplate.system.dao.** {*;}
-keep class com.dingding.managerplate.system.domain.** {*;}
#可以通過這個配置自己添加混淆字典
#-classobfuscationdictionary ./filename.txt
## 混淆類名之后,對使用Class.forName('className')之類的地方進行相應替代
#-adaptclassstrings
# 保持類protected不被混淆
#-keep public class * { public protected <fields>;public protected <methods>; }2.4 修改springboot的啟動文件
讓springboot為bean命名時將包名帶上,不然會因為混淆后不同包下出現(xiàn)同名類而產生沖突
@SpringBootApplication
public class ManagerplateApplication {
public static class CustomGenerator implements BeanNameGenerator {
@Override
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
return definition.getBeanClassName();
}
}
public static void main(String[] args) {
new SpringApplicationBuilder(ManagerplateApplication.class)
.beanNameGenerator(new CustomGenerator())
.run(args);
}
}2.5 執(zhí)行 sudo mvn clean package -DskipTests
(最好加sudo,別問我怎么知道的)
2.6 混淆完成,生成可執(zhí)行jar包
在target目錄下會生成4個文件:
- classes-pg.jar 混淆后的classes文件,里面包含完整的項目結構
- proguard_map.txt 混淆內容的映射
- proguard_seed.txt 參與混淆的類
- 還有一個未混淆的原始jar包
#解壓class-pg.jar 和未混淆的jar包 unzip class-pg.jar unzip 未混淆的jar包 #將class-pg.jar解壓出的所有內容替換掉 未混淆的jar包/BOOT-INF/classes下的全部文件 #重新打包被替換過的jar包 jar cvfM0 name.jar *
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java深入學習圖形用戶界面GUI之創(chuàng)建窗體
圖形編程中,窗口是一個重要的概念,窗口其實是一個矩形框,應用程序可以使用其從而達到輸出結果和接受用戶輸入的效果,學習了GUI就讓我們用它來創(chuàng)建一個窗體2022-05-05
SpringBoot整合RocketMQ極速實戰(zhàn)教程
本文詳細介紹了SpringBoot集成RocketMQ的全過程,涵蓋普通、廣播、順序、延遲、批量、過濾、事務等多種消息模式,通過自動裝配、全局配置、核心組件等介紹RocketMQ與SpringBoot的深入集成原理與實戰(zhàn)應用,感興趣的朋友一起看看吧2026-06-06
SpringBoot基于Minio實現(xiàn)分片上傳、斷點續(xù)傳的實現(xiàn)
本文主要介紹了SpringBoot基于Minio實現(xiàn)分片上傳、斷點續(xù)傳的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08
Spring?Security方法級安全控制@PreAuthorize注解的靈活運用小結
本文將帶著大家講解?@PreAuthorize?注解的核心原理、SpEL?表達式機制,并通過的示例代碼演示如何在實際項目中靈活運用該注解實現(xiàn)細粒度的權限控制,感興趣的朋友一起看看吧2025-04-04
java 記錄一個子串在整串中出現(xiàn)的次數(shù)實例
今天小編就為大家分享一篇java 記錄一個子串在整串中出現(xiàn)的次數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Java調用Creo?2.0讀取/修改模型參數(shù)的實戰(zhàn)指南
本文詳細講解了使用Java調用Creo2.0實現(xiàn).prt模型參數(shù)讀取與修改的方法,強調方向大于努力,不可完全依賴AI;提供實測可用代碼、操作步驟及避坑要點;涵蓋環(huán)境配置、關鍵注意事項、執(zhí)行步驟與常見問題排查等內容,適合Creel.0二次開發(fā)新手參考,需要的朋友可以參考下2026-05-05

