長(zhǎng)春網(wǎng)站開發(fā)公司哪家好在線推廣
前言:在打包Springboot項(xiàng)目成jar包時(shí)需要在pom.xml使用spring-boot-maven-plugin來增加Maven功能,在我的上一篇博客<<Maven生命周期和插件的那些事(2021版)>>中已經(jīng)介紹過Maven和插件的關(guān)系,在此不再贅述,感興趣的小伙伴可以點(diǎn)擊鏈接了解下。那么到底spring-boot-maven插件到底增加了哪些功能并沒有深入探討,下面針對(duì)Maven的package命令,分使用和不適用spring-boot-maven插件兩種情境下的控制臺(tái)輸出和jar包組成簡(jiǎn)單討論下。
以下兩張圖的文字描述和控制臺(tái)輸出可以得出:運(yùn)行mvn package命令時(shí),使用spring-boot-maven插件的打包過程比沒有使用spring-boot-maven插件多了一次repackage過程,下面簡(jiǎn)單記錄下repackage到底干了哪些工作?
一、首先對(duì)比下打包的成果物:
可以發(fā)現(xiàn)使用spring-boot-maven-plugin插件的比沒有使用的場(chǎng)景,多了一個(gè)以.original結(jié)尾的文件,且該文件的大小與沒使用spring-boot-maven插件打包的jar文件大小一樣。下面對(duì)這兩個(gè)大小一樣的文件解壓縮,解壓后內(nèi)容如下,可以看到解壓后的內(nèi)容無論是大小還是目錄結(jié)構(gòu)以及目錄下的內(nèi)容都一樣。
對(duì)此我們可以得出第一個(gè)結(jié)論:spring-boot-maven-plugin的package(goal)將Maven的package命令默認(rèn)實(shí)現(xiàn)(jar:jar)打包的重命名為XXX.jar.original
二、下面開始分析由spring-boot-maven插件打包的jar包結(jié)構(gòu)如下:
BOOT-INF目錄下有兩個(gè)子目錄:classes和lib目錄。lib目錄存放的是應(yīng)用依賴的jar包,具體參照Maven的pom.xml中的依賴內(nèi)容。classes目錄下存放的是項(xiàng)目CLASS_PATH下的內(nèi)容,包括應(yīng)用代碼和配置文件(比如application.yml等),可以理解為repackage將原始Maven打包的jar文件中的除META-INF以外的內(nèi)容放置到該目錄下打包。
META-INF目錄下存放的是應(yīng)用相關(guān)的元信息,比如JAR包的必要配置文件MANIFEST.MF和Maven的配置文件等。
org目錄下放置的與springboot應(yīng)用jar加載和啟動(dòng)相關(guān)的類,后期會(huì)有博客專門講解springboot應(yīng)用的啟動(dòng)過程,會(huì)重點(diǎn)分析spring-boot-loader的。
根據(jù)以上控制臺(tái)日志輸出以及有無spring-boot-maven插件下打包形成的jar包組成可以推斷,spring-boot-maven插件的repackage(goal)有如下兩個(gè)作用:
1、在原始Maven打包形成的jar包基礎(chǔ)上,進(jìn)行重新打包,新形成的jar包不但包含應(yīng)用類文件和配置文件,而且還會(huì)包含應(yīng)用所依賴的jar包以及Springboot啟動(dòng)相關(guān)類(loader等),以此來滿足Springboot獨(dú)立應(yīng)用的特性;
2、將原始Maven打包的jar重命名為XXX.jar.original作為原始文件;
以上,完了!