最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot結(jié)合ProGuard實(shí)現(xiàn)代碼混淆(最新版)

 更新時(shí)間:2020年10月09日 11:14:44   作者:執(zhí)筆記憶的空白  
這篇文章主要介紹了SpringBoot結(jié)合ProGuard實(shí)現(xiàn)代碼混淆(最新版),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

研究ProGuard也花了兩天時(shí)間,其實(shí)最主要的時(shí)間花在前面proguard讀取jar包的時(shí)候相關(guān)jar沖突的問題,但是總的來說不用拆分SpringBoot項(xiàng)目并且實(shí)現(xiàn)代碼混淆已經(jīng)很舒服了。

ProGuard集成

 1.maven的配置

具體配置如下:

<build>
		<finalName>${artifactId}</finalName>
		<plugins>
			<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>
					<injar>${project.build.finalName}.jar</injar>
					<outjar>${project.build.finalName}.jar</outjar>
					<!--<proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>-->
					<obfuscate>true</obfuscate>
					<options>
						<!-- 不做收縮(刪除注釋、未被引用代碼)-->
						<option>-dontshrink</option>
						<!-- 不做優(yōu)化(變更代碼實(shí)現(xiàn)邏輯)-->
						<option>-dontoptimize</option>
						<!--保持目錄結(jié)構(gòu),否則spring的自動(dòng)注入無法使用-->
						<!--<option>-keepdirectories</option>-->
						<option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
							SourceFile,LineNumberTable, *Annotation*,EnclosingMethod
						</option>
						<option>-adaptclassstrings</option>
						<option>
							<!-- 保護(hù)程序入口 -->
							 -keep class com.jingchen.ccny.CmepApplication { *; }
						</option>
						<option>-keepnames interface ** { *; }</option>
						<!-- 固定幾個(gè)類不能混淆-->
						<option>-keepnames class com.jingchen.ccny.base.BaseService { *; }</option>
						<option>-keep class com.jingchen.ccny.common.cache.ConvertorNewCache { *; }</option>
						<option>-keep class com.jingchen.ccny.base.ControllerContext { *; }</option>
						<option>-keep class * extends com.jingchen.ccny.base.BaseService</option>
						<option>-keep class * implements com.jingchen.ccny.common.service.CallBackGuiService</option>
						<option>-keep class * implements com.jingchen.ccny.common.service.CallBackUDService</option>
						<option>-keep class com.jingchen.ccny.util.SpringUtil</option>
						<!--<option>-keep interface * extends * { *; }</option>-->
						<!-- 此選項(xiàng)將在所有包的所有類中保存所有原始定義的注釋.-->
						<option>
							 -keep class * {
							@org.springframework.beans.factory.annotation.Autowired *;
							@org.springframework.beans.factory.annotation.Value *;
							@org.springframework.stereotype.Service *;
							@org.springframework.stereotype.Component *;
							@org.springframework.scheduling.annotation.Scheduled *;

							}
						</option>
					</options>
					<libs>
						<!-- Include main JAVA library required.-->
						<lib>${java.home}/lib/rt.jar</lib>
						<lib>${java.home}/lib/jce.jar</lib>
					</libs>
				</configuration>
				<dependencies>
					<dependency>
						<groupId>net.sf.proguard</groupId>
						<artifactId>proguard-base</artifactId>
						<version>6.2.2</version>
					</dependency>
				</dependencies>
			</plugin>

			<!-- Maven assembly must be run after proguard obfuscation so it take already obfuscated files.-->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
						<configuration>
							<mainClass>com.jingchen.ccny.CcnyApplication</mainClass>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

這里里面級聯(lián)引用的jar很多,建議配置了私服的人先把鏡像地址配置成maven中央倉庫地址,這樣先下下來相關(guān)依賴的包,然后再上傳到你們的私服上去。據(jù)我研究中知道的jar就有:

在這里插入圖片描述

注意:不連外網(wǎng)配置maven中央倉庫的話,少了jar你們會(huì)很頭疼的。而且不止net.sf.proguard相關(guān)包,還包括了com.guardsquare.proguard-base 和 com.guardsquare.proguard-core 相關(guān)的jar,所以真的連外網(wǎng)下包很重要?。。?!

推薦一個(gè)IDEA解決maven引用沖突的插件:Maven Helper

2.相關(guān)異常解決

idea A required class was missing … org/apache/tools/ant/BuildListener
問題原因
這個(gè)問題就是上面提到的因?yàn)閍pache的編譯用了一個(gè)ant-1.9.3的包,這個(gè)是級聯(lián)引用的,開始我是內(nèi)網(wǎng)maven私服,單純的引入net.sf.proguard相關(guān)和com.github.wvengen相關(guān)的jar還是會(huì)缺少很多jar
解決方案
連上外網(wǎng),配置你的maven的setting.xml 的mirror鏡像地址,配置成Maven中央倉庫的地址,將相關(guān)的jar都下下來,然后再通過命令把你本地maven倉庫的jar上傳到私服去

Can't process class [META-INF/versions/9/org/apache/logging/log4j/util/Base64Util.class]

Can't process class [META-INF/versions/11/module-info.class]
問題原因
這個(gè)問題的原因有很多方面,最主要的就是我們的jdk版本是1.8,我最開始用的ProGuard是5.3.3版本,然而我們SpringBoot的版本是2.3.3版本,SpringBoot2.3.3版本太新了,里面引用的相關(guān)包都是java9和java11的版本,這樣ProGuard在讀jar的時(shí)候會(huì)無法識(shí)別。這些問題在提升Proguard版本到6.2.2之后都解決了
解決方案
開始我的解決方案是忽略這些相關(guān)的jar, 例如在pom.xml的option配置:

<option>-libraryjars ${settings.localRepository}/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar(META-INF/versions/11/module-info.class)</option>

但是我這樣配置之后,重新打包會(huì)提示:

The same input jar [E:\maven\repo\com\zaxxer\HikariCP\3.4.5\HikariCP-3.4.5.jar] is specified twice.
解決方案
而且我還嘗試了maven引用的時(shí)候排除這些高版本的級聯(lián)引用jar,單獨(dú)引用低版本,但最終還是因?yàn)樘爆嵍艞壛?。直接提升Proguard版本到6.2.2 這些讀jar的版本問題就解決了。Annotation-specified bean name ‘a(chǎn)' for bean class
問題原因
出現(xiàn)這個(gè)問題主要還是混淆之后,bean重名了,spring默認(rèn)是把類名的首字母小寫加載到容器里面,我們混淆類名之后,就容易造成beanName重復(fù)。
解決方案
慶幸的是,我們可以通過改變spring加載bean的命名策略來解決這個(gè)問題,把包名帶上,同時(shí)在獲取Spring上下文getBean的時(shí)候,加上包名路徑即可
啟動(dòng)類配置,具體如下:

@SpringBootApplication
public class CcnyApplication{

	public static class CustomGenerator implements BeanNameGenerator {

		@Override
		public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
			return definition.getBeanClassName();
		}
	}

	public static void main(String[] args) {
		SpringApplicationBuilder sab=new SpringApplicationBuilder(CcnyApplication.class)
				.beanNameGenerator(new CustomGenerator());
		//這里如果想打印你加載的Spring的bean,可以這樣做:
		ApplicationContext ac =sab.run(args);
		Arrays.stream(ac.getBeanDefinitionNames()).forEach(System.out::println);
	}
}

這樣配置,你啟動(dòng)的時(shí)候就能看到加載的所有的beanName(這里Service會(huì)帶上package路徑)

其他地方getBean的用法:

//這里的packagePath = com.jingchen.ccny.service
CallBackGuiService callBackGuiService = (CallBackGuiService) SpringUtil.getBean(packagePath+serviceName);
     callBackResult = callBackGuiService.excute(convertMap);

這樣你就能正常的獲取到Spring容器加載的beanName了

注意事項(xiàng)

基本上影響打包和啟動(dòng)的就上面一些問題了,其他的就是你們項(xiàng)目里面的細(xì)節(jié)了,

  • 比如DAO要保留,要和mybatis里面的Mapper映射對應(yīng),DAO里面的方法傳參要改為map或者實(shí)體,另外序列化后的實(shí)體要保留
  • Controller里面的方法入?yún)?,如果用了?shí)體,這部分實(shí)體也要保留(保證其變量不會(huì)被混淆,不然傳值收不到)
  • 另外就是你們spring相關(guān)的XML里面,如果單獨(dú)配置了Bean和Bean屬性的,這類bean要保留,不能被混淆
  • 我這里保留了所有的接口和接口里面的方法,已經(jīng)我們自定義的抽象類BaseService里面的方法名不會(huì)被混淆,這些你們可以自己定義,而且我這里定義了有標(biāo)注@Component的類也保留類名,按照我上面的配置,基本上可以不用重新構(gòu)建beanName。正常的application啟動(dòng)就完事了
  • 其他的沒了,就看你們還有沒有什么特定的類不能被混淆,以及你們要混淆的力度(我們的要求是保留所有類名、接口信息和抽象類信息,除此之外的所有類和方法都被混淆!)

總的來說花了兩天時(shí)間,有這樣的成果也是值得高興的,前一天解決jar沖突的比較多,主要原因就是最開始XX架構(gòu)師搭建這個(gè)項(xiàng)目采用最新的SpringBoot版本,jdk確是1.8 , 很多不兼容。

來個(gè)最終的效果圖吧:

在這里插入圖片描述

參考案例

1、Springboot+proguard+maven 混淆.
2、proguard-spring-boot-example
3、官方解釋
4、Proguard的Keep使用方法
5、ProGuard 最全混淆規(guī)則說明
6、ProGuard代碼混淆技術(shù)詳解
7、使用proguard混淆springboot代碼

到此這篇關(guān)于SpringBoot結(jié)合ProGuard實(shí)現(xiàn)代碼混淆(最新版)的文章就介紹到這了,更多相關(guān)SpringBoot ProGuard代碼混淆內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡單了解springboot eureka交流機(jī)制

    簡單了解springboot eureka交流機(jī)制

    這篇文章主要介紹了簡單了解springboot eureka交流機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot實(shí)現(xiàn)mysql與clickhouse多數(shù)據(jù)源的項(xiàng)目實(shí)踐

    SpringBoot實(shí)現(xiàn)mysql與clickhouse多數(shù)據(jù)源的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot實(shí)現(xiàn)mysql與clickhouse多數(shù)據(jù)源的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • java 后臺(tái)將base64字符串保存為圖片的方法

    java 后臺(tái)將base64字符串保存為圖片的方法

    本篇文章主要介紹了java 后臺(tái)將base64字符串保存為圖片的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • Hashmap非線程安全關(guān)于hash值沖突處理

    Hashmap非線程安全關(guān)于hash值沖突處理

    這篇文章主要為大家介紹了Hashmap非線程安全關(guān)于hash值沖突的處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Spring實(shí)戰(zhàn)之獲取方法返回值操作示例

    Spring實(shí)戰(zhàn)之獲取方法返回值操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之獲取方法返回值操作,涉及spring配置文件與方法返回值操作相關(guān)使用技巧,需要的朋友可以參考下
    2019-12-12
  • Spring Boot2.x集成JPA快速開發(fā)的示例代碼

    Spring Boot2.x集成JPA快速開發(fā)的示例代碼

    這篇文章主要介紹了Spring Boot2.x集成JPA快速開發(fā),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • SpringBoot基于Actuator遠(yuǎn)程關(guān)閉服務(wù)

    SpringBoot基于Actuator遠(yuǎn)程關(guān)閉服務(wù)

    這篇文章主要介紹了SpringBoot基于Actuator遠(yuǎn)程關(guān)閉服務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 如何通過Java監(jiān)聽MySQL數(shù)據(jù)的變化

    如何通過Java監(jiān)聽MySQL數(shù)據(jù)的變化

    對于二次開發(fā)來說,很大一部分就找找文件和找數(shù)據(jù)庫的變化情況,下面這篇文章主要給大家介紹了關(guān)于如何通過Java監(jiān)聽MySQL數(shù)據(jù)的變化的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Java外觀模式解讀,讓你的代碼優(yōu)雅又高效

    Java外觀模式解讀,讓你的代碼優(yōu)雅又高效

    外觀模式(Facade?Pattern)是一種常用的結(jié)構(gòu)型設(shè)計(jì)模式,它為復(fù)雜的子系統(tǒng)提供一個(gè)簡單的接口,隱藏復(fù)雜的實(shí)現(xiàn)細(xì)節(jié),本文就來講講它是如何簡化代碼,提高可維護(hù)性的
    2023-05-05
  • 利用SpringMVC和Ajax實(shí)現(xiàn)文件上傳功能

    利用SpringMVC和Ajax實(shí)現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了利用SpringMVC和Ajax實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08

最新評論

靖宇县| 察雅县| 建阳市| 五寨县| 安多县| 方城县| 宿迁市| 镇雄县| 宜兰市| 崇文区| 鲁甸县| 靖西县| 卢龙县| 鹤庆县| 巫溪县| 安图县| 武胜县| 灵石县| 宜州市| 财经| 聂荣县| 海门市| 通州区| 锡林郭勒盟| 武定县| 锡林郭勒盟| 忻城县| 东乌| 晋宁县| 卢湾区| 吉安市| 台中市| 洱源县| 黔南| 陇南市| 冕宁县| 同心县| 湾仔区| 张家港市| 杭锦后旗| 察哈|