使用proguard對(duì)maven構(gòu)建的springboot項(xiàng)目進(jìn)行混淆方式
1,配置混淆的問題
配置混淆的時(shí)候可能會(huì)報(bào)很多版本錯(cuò),包括但不限于java版本不對(duì),springboot版本不對(duì),log4j版本不對(duì)。。。。。
其實(shí)只要proguard版本上去了就行,得自己下一個(gè)高版本的proguard.jar.
由于proguard混淆貌似不能指定混淆的類名在basePackages下面類名混淆后唯一,不同包名經(jīng)常有a.class,b.class,c.class之類重復(fù)的類名,因此spring容器初始化bean的時(shí)候會(huì)報(bào)錯(cuò),因?yàn)閟pring不允許不同包下類名一樣,我們需要改變spring的bean的命名策略來解決這個(gè)問題 (見步驟2.4)
dao和domain層不要混淆
2,配置過程
2.1 首先下載
下載proguard 6.2.2,其他版本也行,那就把pom的配置改一改版本號(hào),然后在和pom同一級(jí)的lib下將proguard文件放進(jìn)去,千萬別放在src下,不然等于讓這個(gè)jar包混淆自己,鐵定報(bào)錯(cuò)
2.2 maven pom配置中加入以下
<!-- ProGuard混淆插件--> <plugin> <groupId>com.github.wvengen</groupId> <artifactId>proguard-maven-plugin</artifactId> <executions> <execution> <!-- 混淆時(shí)刻,這里是打包的時(shí)候混淆--> <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> <!-- 對(duì)什么東西進(jìn)行加載,這里僅有classes成功,不可能對(duì)配置文件及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同級(jí)目錄下添加proguard.conf文件
# 忽略所有警告,否則有警告的時(shí)候混淆會(huì)停止 -ignorewarnings # JDK目標(biāo)版本1.8 -target 1.8 # 不做收縮(刪除注釋、未被引用代碼) -dontshrink # 不做優(yōu)化(變更代碼實(shí)現(xiàn)邏輯) -dontoptimize # 不路過非公用類文件及成員 -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers ## 混淆時(shí)不生成大小寫混合的類名,默認(rèn)是可以大小寫混合 -dontusemixedcaseclassnames # 優(yōu)化時(shí)允許訪問并修改有修飾符的類和類的成員 -allowaccessmodification # 確定統(tǒng)一的混淆類的成員名稱來增加混淆 -useuniqueclassmembernames # 不混淆所有包名,本人測(cè)試混淆后WEB項(xiàng)目問題實(shí)在太多,畢竟Spring配置中有大量固定寫法的包名 -keeppackagenames # 不混淆局部變量名 -keepparameternames # 不刪除注解 -keepattributes *Annotation* # 不混淆所有特殊的類 LocalVariable*Table, -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,Synthetic,EnclosingMethod # 不混淆所有的set/get方法,畢竟項(xiàng)目中使用的部分第三方框架(例如Shiro)會(huì)用到大量的set/get映射 -keepclassmembers public class * {void set*(***);*** get*();} ##對(duì)異常、注解信息在runtime予以保留,不然影響springboot啟動(dòng) -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod ##保留main方法的類及其方法名 -keepclasseswithmembers public class * { public static void main(java.lang.String[]);} ##保留枚舉成員及方法 -keepclassmembers enum * { *; } # 不混淆泛型 -keepattributes Signature #?。。。。。。〔换煜齞ao和domain!?。。?! -keep class com.dingding.managerplate.system.dao.** {*;} -keep class com.dingding.managerplate.system.domain.** {*;} #可以通過這個(gè)配置自己添加混淆字典 #-classobfuscationdictionary ./filename.txt ## 混淆類名之后,對(duì)使用Class.forName('className')之類的地方進(jìn)行相應(yīng)替代 #-adaptclassstrings # 保持類protected不被混淆 #-keep public class * { public protected <fields>;public protected <methods>; }
2.4 修改springboot的啟動(dòng)文件
讓springboot為bean命名時(shí)將包名帶上,不然會(huì)因?yàn)榛煜蟛煌鲁霈F(xiàn)同名類而產(chǎ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目錄下會(huì)生成4個(gè)文件:
- classes-pg.jar 混淆后的classes文件,里面包含完整的項(xiàng)目結(jié)構(gòu)
- proguard_map.txt 混淆內(nèi)容的映射
- proguard_seed.txt 參與混淆的類
- 還有一個(gè)未混淆的原始jar包
#解壓class-pg.jar 和未混淆的jar包 unzip class-pg.jar unzip 未混淆的jar包 #將class-pg.jar解壓出的所有內(nèi)容替換掉 未混淆的jar包/BOOT-INF/classes下的全部文件 #重新打包被替換過的jar包 jar cvfM0 name.jar *
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Socket實(shí)現(xiàn)UDP編程淺析
類 DatagramSocket 何 DatagramPacket(數(shù)據(jù)包/數(shù)據(jù)報(bào)) 實(shí)現(xiàn)了基于 UDP協(xié)議網(wǎng)絡(luò)程序;UDP數(shù)據(jù)報(bào)通過數(shù)據(jù)報(bào)套接字 DatagramSocket 發(fā)送和接收,系統(tǒng)不保證 UDP數(shù)據(jù)報(bào)一定能夠安全送達(dá)目的地,也不確定什么時(shí)候可以抵達(dá)2022-11-11Centos 7 安裝 OpenJDK 11 兩種方式及問題小結(jié)
這篇文章主要介紹了Centos 7 安裝 OpenJDK 11 兩種方式,第一種方式使用yum安裝,第二種方式使用tar解壓安裝,每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09淺析非對(duì)稱加密在接口參數(shù)中的實(shí)現(xiàn)
接口層做數(shù)據(jù)加密應(yīng)該算是老生常談的一件事了,業(yè)界用的比較多的,不外乎是對(duì)稱加密,非對(duì)稱加密以及兩者的結(jié)合。本文就來聊聊非對(duì)稱加密在接口參數(shù)中的實(shí)現(xiàn),希望對(duì)大家有所幫助2023-02-02Spring事件監(jiān)聽器之@EventListener原理分析
這篇文章主要介紹了Spring事件監(jiān)聽器之@EventListener原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12springboot中報(bào)錯(cuò)Invalid character found in
這篇文章主要介紹了springboot中報(bào)錯(cuò)Invalid character found in the request的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09spring cloud實(shí)現(xiàn)前端跨域問題的解決方案
這篇文章主要介紹了 spring cloud實(shí)現(xiàn)前端跨域問題的解決方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01如何開啟控制臺(tái)輸出mybatis執(zhí)行的sql日志問題
這篇文章主要介紹了如何開啟控制臺(tái)輸出mybatis執(zhí)行的sql日志問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09ThreadPoolExecutor線程池原理及其execute方法(詳解)
下面小編就為大家?guī)硪黄猅hreadPoolExecutor線程池原理及其execute方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06