欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot的maven多模塊混淆jar包的實(shí)現(xiàn)方法

 更新時(shí)間:2024年03月14日 09:58:35   作者:神的孩子都在歌唱  
springboot可以使用proguard-maven-plugin 這個(gè)插件 在 pom.xml 中自定義proguard 的指令,本文基于 springboot + maven + proguard 的maven多模塊架構(gòu)進(jìn)行代碼混淆,需要的朋友可以參考下

一.簡(jiǎn)介

proguard是廣為使用的混淆工具之一:

  • 它檢測(cè)并刪除未使用的類、字段、方法和屬性。
  • 它優(yōu)化字節(jié)碼并刪除未使用的指令。
  • 它使用簡(jiǎn)短的無(wú)意義名稱重命名其余的類、字段和方法。

springboot可以使用proguard-maven-plugin 這個(gè)插件 在 pom.xml 中自定義proguard 的指令,本文基于 springboot + maven + proguard 的maven多模塊架構(gòu)進(jìn)行代碼混淆。

二. 示例

我的項(xiàng)目模塊如下

chen-common  --公共模塊
chen-start  --啟動(dòng)模塊 里面有啟動(dòng)類ChenApplication
chen-system --邏輯處理模塊

2.1 基本配置

你需要在你的啟動(dòng)類模塊的pom.xml文件中添加如下配置,具體的配置解釋可以去proguard-maven-plugin 官方文檔了解

    <build>
        <finalName>cyz_navigate</finalName>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.6.0</version>
                <executions>
                    <!-- 以下配置說明執(zhí)行mvn的package命令時(shí)候,會(huì)執(zhí)行proguard-->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 防止本地編譯的時(shí)候路徑太長(zhǎng)編譯失敗-->
                    <putLibraryJarsInTempDir>true</putLibraryJarsInTempDir>
                    <!-- 就是輸入Jar的名稱,我們要知道,代碼混淆其實(shí)是將一個(gè)原始的jar,生成一個(gè)混淆后的jar,那么就會(huì)有輸入輸出。 -->
                    <injar>${project.build.finalName}.jar</injar>
                    <!-- 輸出jar名稱,輸入輸出jar同名的時(shí)候就是覆蓋,也是比較常用的配置。 -->
                    <outjar>${project.build.finalName}.jar</outjar>
                    <!-- 是否混淆 默認(rèn)是true -->
                    <obfuscate>true</obfuscate>
                    <!-- 配置一個(gè)文件,通常叫做proguard.cfg,該文件主要是配置options選項(xiàng),也就是說使用proguard.cfg那么options下的所有內(nèi)容都可以移到proguard.cfg中 -->
                    <proguardInclude>${project.basedir}/proguard.cfg</proguardInclude>
                    <!-- 額外的jar包,通常是項(xiàng)目編譯所需要的jar -->
                    <libs>
                        <lib>${java.home}/lib/rt.jar</lib>
                        <lib>${java.home}/lib/jce.jar</lib>
                        <lib>${java.home}/lib/jsse.jar</lib>
                    </libs>
                    <!-- 對(duì)輸入jar進(jìn)行過濾比如,如下配置就是對(duì)META-INFO文件不處理。 -->
                    <!--                    <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>-->
                    <!-- 這是輸出路徑配置,但是要注意這個(gè)路徑必須要包括injar標(biāo)簽填寫的jar -->
                    <outputDirectory>${project.basedir}/target</outputDirectory>
                    <!--這里特別重要,此處主要是配置混淆的一些細(xì)節(jié)選項(xiàng),比如哪些類不需要混淆,哪些需要混淆-->
                    <options>
                        <!-- 可以在這里寫option標(biāo)簽配置,不過我上面使用了proguardInclude,所以可以在proguard.cfg中配置 -->
                    </options>
                    <!--                    子模塊-->
                    <assembly>
                        <inclusions>
                            <inclusion>
                                <groupId>com.chen</groupId>
                                <artifactId>chen-system</artifactId>
                            </inclusion>
                            <inclusion>
                                <groupId>com.chen</groupId>
                                <artifactId>chen-common</artifactId>
                            </inclusion>
                        </inclusions>
                    </assembly>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>com.guardsquare</groupId>
                        <artifactId>proguard-base</artifactId>
                        <version>7.1.0</version>
                        <scope>runtime</scope>
                    </dependency>
                    <dependency>
                        <groupId>com.guardsquare</groupId>
                        <artifactId>proguard-core</artifactId>
                        <version>7.1.0</version>
                        <scope>runtime</scope>
                    </dependency>
                </dependencies>
            </plugin>
            <!--  proguard 代碼混淆配置  結(jié)束-->

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <fork>true</fork> <!-- 如果沒有該配置,devtools不會(huì)生效 -->
                    <mainClass>
                        com.chen.ChenApplication
                    </mainClass>
                    <excludeGroupIds>com.chen</excludeGroupIds>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        
        </plugins>
    </build>

編寫proguard.cfg文件,需要放在和啟動(dòng)類的pom.xml同級(jí)

image-20240308155430071

#指定Java的版本
-target 1.8
#proguard會(huì)對(duì)代碼進(jìn)行優(yōu)化壓縮,他會(huì)刪除從未使用的類或者類成員變量等
-dontshrink
#是否關(guān)閉字節(jié)碼級(jí)別的優(yōu)化,如果不開啟則設(shè)置如下配置  不做優(yōu)化(變更代碼實(shí)現(xiàn)邏輯)
-dontoptimize
#混淆時(shí)不生成大小寫混合的類名,默認(rèn)是可以大小寫混合
-dontusemixedcaseclassnames
# 對(duì)于類成員的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆類名之后,對(duì)使用Class.forName('className')之類的地方進(jìn)行相應(yīng)替代
-adaptclassstrings
#保持目錄結(jié)構(gòu)
-keepdirectories
#對(duì)異常、注解信息予以保留
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod,Qualifier
# 此選項(xiàng)將保存接口中的所有原始名稱(不混淆)-->
#-keepnames interface ** { *; }

# 此選項(xiàng)將保存所有軟件包中的所有原始接口文件(不進(jìn)行混淆)
#-keep interface * extends * { *; }
#保留參數(shù)名,因?yàn)榭刂破?,或者M(jìn)ybatis等接口的參數(shù)如果混淆會(huì)導(dǎo)致無(wú)法接受參數(shù),xml文件找不到參數(shù)
-keepparameternames
# 保留枚舉成員及方法
#-keepclassmembers enum * { *; }
# 不混淆所有類,保存原始定義的注釋-
-keepclassmembers class * {
                        @org.springframework.context.annotation.Bean *;
                        @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 *;
                        @org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration *;
                        @org.springframework.boot.context.properties.ConfigurationProperties *;
                        @org.springframework.web.bind.annotation.RestController *;
                        @org.springframework.beans.factory.annotation.Qualifier *;
                        @io.swagger.annotations.ApiParam *;
                        @org.springframework.validation.annotation.Validated *;
                        @io.swagger.annotations.ApiModelProperty *;
                        @javax.validation.constraints.NotNull *;
                        @javax.validation.constraints.Size *;
                        @javax.validation.constraints.NotBlank *;
                        @javax.validation.constraints.Pattern *;

                        }
-keep class org.springframework.** {*;}
-keep public class ch.qos.logback.**{*;}
-keep class com.fasterxml.jackson.** { *; }

#忽略warn消息
-ignorewarnings
#打印配置信息
-printconfiguration

#入口程序類不能混淆,混淆會(huì)導(dǎo)致springboot啟動(dòng)不了
-keep public class com.chen.ChenApplication { *;}
#mybatis的mapper/實(shí)體類不混淆,否則會(huì)導(dǎo)致xml配置的mapper找不到 ( 保持該目錄下所有類及其成員不被混淆)
-keep class com.chen.system.mapper.** {*;}

# 實(shí)體類,枚舉方法不能混淆
-keep class com.chen.common.enums.** {*;}
-keep class com.chen.common.domain.** {*;}
# 保留特定框架或庫(kù)的類,注解類
-keep class com.chen.common.elasticsearch.** { *; }
-keep class com.chen.common.annotation.** {*;}

#還有一些配置類和Bean不能混淆 比如logPointCut   prefix 這些   @Pointcut  @ConfigurationProperties(prefix = "redisson")
-keep class com.chen.common.aspectj.** {*;}

# 全放開
#-keep class com.ugdsec.** {*;}
#保留Serializable序列化的類不被混淆
# controller 層映射前臺(tái)參數(shù)的類、后端返回的 bean 屬性類等,不能混淆類的成員屬性(如變成 string a;)
#-keepclassmembers  class * implements java.io.Serializable {*;}
-dontwarn

通過maven clean install 打包完后就可以了,切記一定要通過java -jar跑一下,看能否正常運(yùn)行

image-20240308170624550

2.2 結(jié)果

打開jar包發(fā)現(xiàn)文件名都變成了abcd的字母,說明已經(jīng)混淆成功了

image-20240308164902263

三. 錯(cuò)誤

3.1 錯(cuò)誤1

com.alibaba.fastjson.JSONException: default constructor not found. class com.ugdsec.lams.admin.audit.plugin.d.a
        at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:574)
        at com.alibaba.fastjson.parser.ParserConfig.createJavaBeanDeserializer(ParserConfig.java:993)
        at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:879)
        at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:584)
        at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:696)
        at com.alibaba.fastjson.JSON.parseObject(JSON.java:394)
        at com.alibaba.fastjson.JSON.parseObject(JSON.java:298)
        at com.alibaba.fastjson.JSON.parseObject(JSON.java:588)
        at com.ugdsec.lams.admin.common.g.f.a.b(FastJsonUtils.java:69)
        at com.ugdsec.lams.admin.audit.plugin.shared.kafka.consumer.KafkaConsumer.beatsUdp(KafkaConsumer.java:110)

代碼中使用這種工具類通過反射賦值參數(shù),不能將這個(gè)RawMessage混淆,不然找不到

RawMessage raw = FastJsonUtils.toObject(String.valueOf(rawMessage), RawMessage.class);

給他放開了

-keep class com.ugdsec.lams.admin.audit.plugin.journal.RawMessage {*;}

3.2 錯(cuò)誤2

"Name for argument of type [java.lang.Long] not specified, and parameter name information not found in class file either."

這個(gè)報(bào)錯(cuò)是因?yàn)榛煜笄岸藗魅雲(yún)?shù)的值也變了,需要通過@PathVariable指定以下就好

修改前

public ResultData<Boolean> delete(Long id) 

修改后

public ResultData<Boolean> delete(@PathVariable Long id) {

這是個(gè)接口,混淆后id就變成其他值了,前端找不到這個(gè)值

四. 參考文章

SpringBoot + proguard+maven多模塊實(shí)現(xiàn)代碼混淆的方法_java_腳本之家 (jb51.net)

github文檔

以上就是springboot的maven多模塊混淆jar包的實(shí)現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于springboot maven混淆jar包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java實(shí)現(xiàn)播放背景音樂

    java實(shí)現(xiàn)播放背景音樂

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)播放背景音樂,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • springboot如何引入外部yml配置文件

    springboot如何引入外部yml配置文件

    這篇文章主要介紹了springboot如何引入外部yml配置文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 基于Java代碼實(shí)現(xiàn)支付充值的通用流程

    基于Java代碼實(shí)現(xiàn)支付充值的通用流程

    本文給大家分享一段java核心代碼實(shí)現(xiàn)支付充值的通用流程,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-05-05
  • Java?WorkBook對(duì)Excel的基本操作方法

    Java?WorkBook對(duì)Excel的基本操作方法

    這篇文章主要介紹了Java?WorkBook對(duì)Excel的基本操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Mybatis配置之properties和settings標(biāo)簽的用法

    Mybatis配置之properties和settings標(biāo)簽的用法

    這篇文章主要介紹了Mybatis配置之properties和settings標(biāo)簽的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • mybatis plus使用redis作為二級(jí)緩存的方法

    mybatis plus使用redis作為二級(jí)緩存的方法

    這篇文章主要介紹了mybatis plus使用redis作為二級(jí)緩存的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 解決Maven的pom.xml中設(shè)置repository不起作用問題

    解決Maven的pom.xml中設(shè)置repository不起作用問題

    這篇文章主要介紹了解決Maven的pom.xml中設(shè)置repository不起作用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 詳解java接口(interface)在不同JDK版本中的變化

    詳解java接口(interface)在不同JDK版本中的變化

    這篇文章主要介紹了詳解java接口(interface)在不同JDK版本中的變化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • java.lang.OutOfMemoryError: Metaspace異常解決的方法

    java.lang.OutOfMemoryError: Metaspace異常解決的方法

    這篇文章主要介紹了java.lang.OutOfMemoryError: Metaspace異常解決的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java實(shí)現(xiàn)在線五子棋對(duì)戰(zhàn)游戲(人機(jī)對(duì)戰(zhàn))

    Java實(shí)現(xiàn)在線五子棋對(duì)戰(zhàn)游戲(人機(jī)對(duì)戰(zhàn))

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)在線五子棋對(duì)戰(zhàn)游戲(人機(jī)對(duì)戰(zhàn)),文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的可以嘗試一下
    2022-09-09

最新評(píng)論