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

maven混淆打包的實(shí)現(xiàn)步驟

 更新時(shí)間:2024年02月02日 11:40:12   作者:mob6454cc659b12  
本文主要介紹了maven混淆打包的實(shí)現(xiàn)步驟,包含了Maven項(xiàng)目混淆、瘦身、打包exe這幾個(gè)方面,具有一定的參考價(jià)值,感興趣的可以了解一下

項(xiàng)目混淆

ProGuard 是一個(gè)混淆代碼的開(kāi)源項(xiàng)目,它的主要作用是混淆代碼,ProGuard 包括以下 4 個(gè)功能:

  • 壓縮(Shrink):檢測(cè)并移除代碼中無(wú)用的類(lèi)、字段、方法和特性(Attribute)
  • 優(yōu)化(Optimize):對(duì)字節(jié)碼進(jìn)行優(yōu)化,移除無(wú)用的指令
  • 混淆(Obfuscate):使用 a,b,c,d 這樣簡(jiǎn)短而無(wú)意義的名稱(chēng),對(duì)類(lèi)、字段和方法進(jìn)行重命名
  • 預(yù)檢(Preveirfy):在 Java 平臺(tái)上對(duì)處理后的代碼進(jìn)行預(yù)檢,確保加載的 class 文件是可執(zhí)行的

使用 proguard 混淆代碼只能增加閱讀和理解的難度, 并不能百分百保證代碼安全。常用的應(yīng)用場(chǎng)景是項(xiàng)目需要部署到客戶(hù)機(jī)器上,一定程度上防止代碼泄露

具體實(shí)現(xiàn)

1.在原本的SpringBoot項(xiàng)目的pom.xml文件里面加上以下配置

<!--經(jīng)過(guò)修改后,能夠混淆的build段-->
    <build>
        <plugins>
            <!--maven打包插件-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.0.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.mmg.Main</mainClass> <!-- 此處為主入口-->
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <!--proguard混淆插件-->
            <plugin>
                <groupId>com.github.wvengen</groupId>
                <artifactId>proguard-maven-plugin</artifactId>
                <version>2.5.3</version>
                <executions>
                    <execution>
                        <!--打包的時(shí)候開(kāi)始混淆-->
                        <phase>package</phase>
                    </execution>
                </executions>
                <configuration>
                    <proguardVersion>${proguard.version}</proguardVersion>
                    <injar>${project.build.finalName}.jar</injar>
                    <!--輸出的jar-->
                    <outjar>${project.build.finalName}.jar</outjar>
                    <!--是否混淆-->
                    <obfuscate>true</obfuscate>
                    <proguardInclude>${basedir}/proguard.cfg</proguardInclude>
                    <options>
                        <!--默認(rèn)開(kāi)啟,不做收縮(刪除注釋、未被引用代碼)-->
                        <option>-dontshrink</option>
                        <!--默認(rèn)是開(kāi)啟的,這里關(guān)閉字節(jié)碼級(jí)別的優(yōu)化-->
                        <option>-dontoptimize</option>
                        <!--對(duì)于類(lèi)成員的命名的混淆采取唯一策略-->
                        <option>-useuniqueclassmembernames</option>
                        <!--混淆時(shí)不生成大小寫(xiě)混合的類(lèi)名,默認(rèn)是可以大小寫(xiě)混合-->
                        <option>-dontusemixedcaseclassnames</option>
                        <!--混淆類(lèi)名之后,對(duì)使用Class.forName('className')之類(lèi)的地方進(jìn)行相應(yīng)替代-->
                        <option>-adaptclassstrings</option>
                        <!--對(duì)異常、注解信息在runtime予以保留,不然影響springboot啟動(dòng)-->
                        <option>-keepattributes
                            Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
                        </option>
                        <!--此選項(xiàng)將保存接口中的所有原始名稱(chēng)(不混淆)-->
                        <option>-keepnames interface ** { *; }</option>
                        <!--此選項(xiàng)將保存所有軟件包中的所有原始接口文件(不進(jìn)行混淆)-->
                        <!--<option>-keep interface * extends * { *; }</option>-->
                        <!--此選項(xiàng)將保留所有原始方法參數(shù),controller如果參數(shù)也混淆會(huì)導(dǎo)致傳參映射不上  -->
                        <option>-keepparameternames</option>
                        <!--保留枚舉成員及方法-->
                        <option>-keepclassmembers enum * { *; }</option>
                        <!--不混淆所有類(lèi),保存原始定義的注釋-->
                        <!--<option>-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 *;
                            }
                        </option>-->
                        <!--忽略warn消息-->
                        <option>-ignorewarnings</option>
                        <!--忽略note消息-->
                        <option>-dontnote</option>
                    </options>
                    <!--java 11-->
                    <libs>
                        <lib>${java.home}/jmods/</lib>
                    </libs>
                    <!--java 8-->
                    <!-- <libs>
                         <lib>${java.home}/lib/rt.jar</lib>
                         <lib>${java.home}/lib/jsse.jar</lib>
                     </libs>-->
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>com.guardsquare</groupId>
                        <artifactId>proguard-base</artifactId>
                        <version>7.2.1</version>
                    </dependency>
                </dependencies>
            </plugin>
            <!--將自己加入的jar也打包插件 可加可不加-->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.mmg.Main</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>.</Class-Path>
                        </manifestEntries>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

2.在與pom.xml文件同級(jí)目錄下新建一個(gè)proguard.cfg文件,這個(gè)文件是混淆的核心配置文件,根據(jù)需求進(jìn)行配置

Java maven 項(xiàng)目混淆 maven混淆打包_java

#所有類(lèi)(包括接口)的方法參數(shù)不混淆(包括沒(méi)被keep的),如果參數(shù)混淆了,mybatis的mapper參數(shù)綁定會(huì)出錯(cuò)(如#{id})
-keepattributes MethodParameters

#入口程序類(lèi)不能混淆,混淆會(huì)導(dǎo)致springboot啟動(dòng)不了
-keep class com.langyastudio.edu.admin.Application {
        public static void main(java.lang.String[]);
     }

#mybatis的mapper/實(shí)體類(lèi)不混淆,否則會(huì)導(dǎo)致xml配置的mapper找不到
-keep class com.langyastudio.edu.admin.dao.*
-keeppackagenames com.langyastudio.edu.admin.dao

#考慮到scanBasePackages,需要包名不被修改
-keeppackagenames com.langyastudio.edu
-keeppackagenames com.langyastudio.edu.admin.common

#一些配置類(lèi)比如datasource,aopconfig如果混淆會(huì)導(dǎo)致各種啟動(dòng)報(bào)錯(cuò)
# 比如用@Pointcut("execution(public * com.langyastudio.edu.*.controller..*.*(..))")
# 指定webLog方法對(duì)應(yīng)的@Pointcut作為切入點(diǎn),所以包的名字不能修改
-keeppackagenames com.langyastudio.edu.*.controller.**
-keep class com.langyastudio.edu.admin.config.*

#保留Serializable序列化的類(lèi)不被混淆
#例如傳入/輸出的Bean屬性
-keepclassmembers class * implements java.io.Serializable {*;}

#保留空的構(gòu)造函數(shù)
#-keepclassmembers class com.hacfin.* {
# public <init>(...);
#}

3.點(diǎn)擊maven生命周期中的package將項(xiàng)目進(jìn)行打包,然后點(diǎn)擊maven插件中的proguard插件對(duì)打出來(lái)的jar進(jìn)行混淆。值得注意的是,如果你使用將自己加入的jar也打包插件,他會(huì)把加入自己jar包的命名為xxxxx-jar-with-dependencies.jar,而混淆只能混淆原jar包,這時(shí)候需要你把xxxxx-jar-with-dependencies.jar修改為正常打包出來(lái)的jar名字(xxx-1.0-SNAPSHOT),不然會(huì)混淆不了

Java maven 項(xiàng)目混淆 maven混淆打包_java_02

Java maven 項(xiàng)目混淆 maven混淆打包_maven_03

Java maven 項(xiàng)目混淆 maven混淆打包_spring boot_04

 項(xiàng)目瘦身

什么是瘦身?

瘦身: thin Body 又稱(chēng) "減肥"、"減重"。 就是合理、科學(xué)的減輕自身重量的。SpringBoot 應(yīng)用瘦身顧名思議:就是將 SpringBoot 應(yīng)用打包的 jar 利用合理的方式、方法減小體積。

為什么要瘦身?

場(chǎng)景: 現(xiàn)有的應(yīng)用開(kāi)發(fā)中,不論是單體架構(gòu)、微服務(wù)架構(gòu),如果項(xiàng)目采用的是 springboot、springcloud 來(lái)作為底層框架,打包時(shí)最終都會(huì)以jar包的方式打包、部署。這是就會(huì)面臨一個(gè)問(wèn)題,就是 jar 包非常大,單體應(yīng)用還好,但是如果是微服務(wù)就非常痛苦,幾十個(gè)微服務(wù)就要拆分打包幾十個(gè) jar 包,每個(gè) jar 包都很大(幾百M(fèi)),合起來(lái)就好幾個(gè) GB,非常占用空間。如果是內(nèi)網(wǎng)部署,遇到動(dòng)輒GB的升級(jí)包還能勉強(qiáng)接受,最多就是運(yùn)維心里默默地吐槽一下,但是如果在外網(wǎng)云環(huán)境、或者客戶(hù)現(xiàn)場(chǎng),那令人痛不欲生的帶寬加上各種網(wǎng)絡(luò)轉(zhuǎn)換限制,運(yùn)維心里各種??。因?yàn)檫@個(gè)你的領(lǐng)導(dǎo)又給你各種批頭蓋臉一頓。

如何瘦身?

瘦身思路:

其實(shí)就是將你自己寫(xiě)的代碼和引入依賴(lài)包進(jìn)行分離操作,它并不能改變項(xiàng)目總體的大小,但是它方便你日后對(duì)項(xiàng)目進(jìn)行升級(jí)操作,日后只需要換jar就可以了,不需要?jiǎng)庸潭ㄒ胍蕾?lài)jar包文件夾。

Java maven 項(xiàng)目混淆 maven混淆打包_jar_05

具體實(shí)現(xiàn)

1.在原本的SpringBoot項(xiàng)目的pom.xml文件里面加上以下配置

<!--經(jīng)過(guò)修改后,能夠瘦身的build段-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <finalName>${project.build.finalName}</finalName>
                    <!--解決windows命令行窗口中文亂碼-->
                    <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
                    <layout>ZIP</layout>
                    <includes>
                        <!--這里是填寫(xiě)需要包含進(jìn)去的jar,
                            必須項(xiàng)目中的某些模塊,會(huì)經(jīng)常變動(dòng),那么就應(yīng)該將其坐標(biāo)寫(xiě)進(jìn)來(lái)
                            如果沒(méi)有則non-exists ,表示不打包依賴(lài)
                        -->
                        <include>
                            <groupId>non-exists</groupId>
                            <artifactId>non-exists</artifactId>
                        </include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- 此插件用于將依賴(lài)包抽出-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!--抽出到哪個(gè)目錄,${project.build.directory}表示當(dāng)前項(xiàng)目構(gòu)建的目錄-->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!--是否排除傳遞性-->
                            <excludeTransitive>false</excludeTransitive>
                            <!--是否去掉 jar 包版本信息-->
                            <stripVersion>false</stripVersion>
                            <!--包含范圍-->
                            <includeScope>runtime</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

2.經(jīng)過(guò)以上操作你再進(jìn)行項(xiàng)目打包后,你的項(xiàng)目將會(huì)分為自己寫(xiě)的代碼jar包和分離出來(lái)的jar包目錄,到這還沒(méi)結(jié)束,需要配合以下參數(shù)啟動(dòng)項(xiàng)目才行。

java -Dloader.path=./lib -jar xxx.jar

項(xiàng)目打包exe

可以使我們的項(xiàng)目直接由jar包打包成exe可執(zhí)行程序

具體實(shí)現(xiàn)

第一種實(shí)現(xiàn)方式

正常將我們的項(xiàng)目打成jar包,打包好以后先打開(kāi)看一下確保可以正確執(zhí)行

Java maven 項(xiàng)目混淆 maven混淆打包_spring boot_06

 2.在當(dāng)前目錄加入以下腳本對(duì)jar包進(jìn)行打包,根據(jù)自己的jar包名稱(chēng)對(duì)以下腳本進(jìn)行修改即可!全部修改完成,雙擊此bat腳本即可

@echo off
echo package current jar to exe
set USE_JAR=PackageExe-1.0-SNAPSHOT.jar
set USE_CONFIG=config
set APP_CLASS=
set APP_NAME="SpringBootTest"
set OUT_FILE="SpringBootTest"
set TITLE="SpringBootTestDemo"

javapackager -deploy -native -outdir packages -outfile %OUT_FILE% -srcfiles %USE_JAR% -appclass org.springframework.boot.loader.JarLauncher -name %APP_NAME% -title %TITLE%

pause

Java maven 項(xiàng)目混淆 maven混淆打包_spring boot_07

Java maven 項(xiàng)目混淆 maven混淆打包_java_08

Java maven 項(xiàng)目混淆 maven混淆打包_Java maven 項(xiàng)目混淆_09

 第二種實(shí)現(xiàn)方式

1.在原本的SpringBoot項(xiàng)目的pom.xml文件里面加上以下配置,一樣的道理根據(jù)自己的情況進(jìn)行修改!

 2.雙擊package打包按鈕,他就會(huì)根據(jù)你的配置生成對(duì)應(yīng)的目錄,目錄內(nèi)含有exe文件和jdk運(yùn)行環(huán)境

Java maven 項(xiàng)目混淆 maven混淆打包_java_10

Java maven 項(xiàng)目混淆 maven混淆打包_jar_11

Java maven 項(xiàng)目混淆 maven混淆打包_java_12

 總結(jié)

1.代碼混淆使用的是ProGuard開(kāi)源項(xiàng)目的插件

2.項(xiàng)目瘦身采用的是將jar包和依賴(lài)項(xiàng)分離

3.打成exe可執(zhí)行文件使用的是javapackager

到此這篇關(guān)于maven混淆打包的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)maven混淆打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java編程接口調(diào)用的作用及代碼分享

    Java編程接口調(diào)用的作用及代碼分享

    這篇文章主要介紹了Java編程接口調(diào)用的作用及代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 實(shí)現(xiàn)quartz定時(shí)器及quartz定時(shí)器原理介紹

    實(shí)現(xiàn)quartz定時(shí)器及quartz定時(shí)器原理介紹

    Quartz是一個(gè)大名鼎鼎的Java版開(kāi)源定時(shí)調(diào)度器,功能強(qiáng)悍,使用方便,下面我們看看如何使用它
    2013-12-12
  • Java異常類(lèi)型介紹及處理方法

    Java異常類(lèi)型介紹及處理方法

    這篇文章介紹了Java異常類(lèi)型介紹及處理方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Java開(kāi)發(fā)者推薦的10種常用工具

    Java開(kāi)發(fā)者推薦的10種常用工具

    這篇文章主要為大家詳細(xì)介紹了Java開(kāi)發(fā)者推薦的10種常用工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 詳解Spring MVC/Boot 統(tǒng)一異常處理最佳實(shí)踐

    詳解Spring MVC/Boot 統(tǒng)一異常處理最佳實(shí)踐

    在 Web 開(kāi)發(fā)中, 我們經(jīng)常會(huì)需要處理各種異常,這篇文章主要介紹了詳解Spring MVC/Boot 統(tǒng)一異常處理最佳實(shí)踐,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java批量操作如何提升ORM框架的批處理性能

    Java批量操作如何提升ORM框架的批處理性能

    本文介紹的批量插入、更新、刪除和讀取優(yōu)化技術(shù),以及性能監(jiān)控與調(diào)優(yōu)方法,為開(kāi)發(fā)者提供了全面的批處理性能優(yōu)化思路,感興趣的朋友一起看看吧
    2025-05-05
  • 配置hadoop環(huán)境mapreduce連接不上hdfs解決

    配置hadoop環(huán)境mapreduce連接不上hdfs解決

    這篇文章主要為大家介紹了配置hadoop環(huán)境mapreduce連接不上hdfs解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 淺談Maven的build生命周期和常用plugin

    淺談Maven的build生命周期和常用plugin

    Maven和gradle應(yīng)該是現(xiàn)代java程序員中使用的最多的兩種構(gòu)建工具。在它們出現(xiàn)之前,則是ant的天下。本文將介紹Maven的build生命周期和常用plugin。
    2021-06-06
  • springboot斷言異常封裝與統(tǒng)一異常處理實(shí)現(xiàn)代碼

    springboot斷言異常封裝與統(tǒng)一異常處理實(shí)現(xiàn)代碼

    異常處理其實(shí)一直都是項(xiàng)目開(kāi)發(fā)中的大頭,但關(guān)注異常處理的人一直都特別少,下面這篇文章主要給大家介紹了關(guān)于springboot斷言異常封裝與統(tǒng)一異常處理的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • MyBatis一二級(jí)緩存

    MyBatis一二級(jí)緩存

    這篇文章主要介紹了MyBatis一二級(jí)緩存的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-06-06

最新評(píng)論

汨罗市| 扶绥县| 临江市| 深圳市| 土默特右旗| 天祝| 蓝田县| 鱼台县| 长岭县| 东宁县| 上高县| 黎平县| 岳阳县| 麻栗坡县| 昌邑市| 旺苍县| 津市市| 莱阳市| 潍坊市| 南安市| 军事| 拜泉县| 博客| 小金县| 鲁山县| 丽水市| 尚志市| 固原市| 大姚县| 株洲县| 尚义县| 开江县| 乌兰浩特市| 河津市| 渑池县| 云龙县| 阿城市| 潢川县| 海伦市| 荆门市| 子洲县|