新聞中心
[[411049]]
本文轉(zhuǎn)載自微信公眾號「Java大廠面試官」,作者laker。轉(zhuǎn)載本文請聯(lián)系Java大廠面試官公眾號。

成都創(chuàng)新互聯(lián)一直在為企業(yè)提供服務(wù),多年的磨煉,使我們在創(chuàng)意設(shè)計,全網(wǎng)整合營銷推廣到技術(shù)研發(fā)擁有了開發(fā)經(jīng)驗(yàn)。我們擅長傾聽企業(yè)需求,挖掘用戶對產(chǎn)品需求服務(wù)價值,為企業(yè)制作有用的創(chuàng)意設(shè)計體驗(yàn)。核心團(tuán)隊(duì)擁有超過10余年以上行業(yè)經(jīng)驗(yàn),涵蓋創(chuàng)意,策化,開發(fā)等專業(yè)領(lǐng)域,公司涉及領(lǐng)域有基礎(chǔ)互聯(lián)網(wǎng)服務(wù)達(dá)州主機(jī)托管、app軟件開發(fā)、手機(jī)移動建站、網(wǎng)頁設(shè)計、網(wǎng)絡(luò)整合營銷。
- 背景
- 使用
- 工作原理
- 額外補(bǔ)充
- 運(yùn)行應(yīng)用程序進(jìn)行預(yù)熱
- 使用Maven在編譯期打包依賴項(xiàng)
- 生產(chǎn)環(huán)境
背景
Spring Boot 默認(rèn)打的Jar,包含應(yīng)用程序代碼及其所有依賴項(xiàng)(內(nèi)置tomcat jar就不小了),所以打包出來的jar文件很大,動不動就幾十,上百M(fèi),稱之為Fat jar。
在網(wǎng)速不給力的情況下,上傳服務(wù)器非常耗時。然而,其中我們引用到的Tomcat、Spring以及其他第三方組件,它們大部分時間是不會修改的而且占用了很大的空間,每次打包打進(jìn)去。其實(shí),我們經(jīng)常改動的內(nèi)容都是我們自己編寫的代碼,其大小大概也就幾十KB,每次升級我們只需替換這些文件即可。
Spring社區(qū)大概也考慮到了開發(fā)者有這樣的需求,所以提供了spring-boot-thin-launcher這個插件用來將項(xiàng)目的依賴和配置從jar包中分離出去。
使用
官網(wǎng)地址:https://github.com/spring-projects-experimental/spring-boot-thin-launcher
在Spring Boot pom文件中新增插件如下:
org.springframework.boot spring-boot-maven-plugin org.springframework.boot.experimental spring-boot-thin-layout 1.0.27.RELEASE
然后還像以前一樣執(zhí)行mvn clean package,這時生成的jar包僅幾十KB。
我這里因?yàn)轫?xiàng)目有很多靜態(tài)文件所以比較大有2MB。
執(zhí)行java -jar xxx.jar即可直接運(yùn)行程序。
除了jar文件減小了,其他效果看著與Fat jar是一樣。
嘗鮮之后,來看下其內(nèi)部原理吧。
工作原理
我們來看下Jar包內(nèi)部的構(gòu)成。
- Manifest-Version: 1.0
- Implementation-Title: map
- Implementation-Version: 0.0.1-SNAPSHOT
- Start-Class: com.laker.map.LakerMapApplication
- Spring-Boot-Classes:
- Build-Jdk-Spec: 1.8
- Spring-Boot-Version: 2.3.7.RELEASE
- Created-By: Maven Jar Plugin 3.2.0
- Main-Class: org.springframework.boot.loader.wrapper.ThinJarWrapper
即啟動類實(shí)際為:ThinJarWrapper
ThinJarWrapper類
我們編寫的代碼
項(xiàng)目的Pom文件
當(dāng)執(zhí)行java -jar xxx.jar時,實(shí)際執(zhí)行的是ThinJarWrapper,它會先在指定目錄搜索看看依賴的jar包是否都存在,存在則直接使用,如果不存在,先從Maven中央倉庫下載到本地,然后,再執(zhí)行我們自己編寫的main()入口方法。這種方式有點(diǎn)類似很多在線安裝程序:用戶下載后得到的是一個很小的exe安裝程序,執(zhí)行安裝程序時,會首先在線下載所需的若干巨大的文件,再進(jìn)行真正的安裝。
這個spring-boot-thin-launcher在啟動時搜索的默認(rèn)目錄是用戶主目錄的.m2,我們也可以指定下載目錄,例如,將下載目錄指定為當(dāng)前目錄:
- java -Dthin.root=. -jar xxx.jar
執(zhí)行后發(fā)現(xiàn)當(dāng)前目錄下自動生成了一個repository目錄,這和Maven的默認(rèn)下載目錄~/.m2/repository的結(jié)構(gòu)是完全一樣的,只是它僅包含xxx.jar所需的運(yùn)行期依賴項(xiàng)。
- repository/
- com/
- net/
- org/
- ...
“注意:只有首次運(yùn)行時會自動下載依賴項(xiàng),再次運(yùn)行時由于無需下載,所以啟動速度會大大加快。如果刪除了repository目錄,再次運(yùn)行時就會再次觸發(fā)下載。
額外補(bǔ)充
運(yùn)行應(yīng)用程序進(jìn)行預(yù)熱
緩存依賴項(xiàng)的最簡單方法是在目標(biāo)環(huán)境中對應(yīng)用程序進(jìn)行預(yù)熱運(yùn)行。正如我們之前看到的,這將導(dǎo)致依賴項(xiàng)被下載并緩存在本地 Maven 存儲庫中。如果我們運(yùn)行多個應(yīng)用程序,存儲庫最終將包含所有依賴項(xiàng)而沒有重復(fù)項(xiàng)。
由于運(yùn)行應(yīng)用程序可能會產(chǎn)生不必要的副作用,我們還可以執(zhí)行“試運(yùn)行”,只解析和下載依賴項(xiàng),而無需運(yùn)行任何用戶代碼:
- java -Dthin.dryrun=true -Dthin.root=. -jar xxx.jar
使用Maven在編譯期打包依賴項(xiàng)
添加以下依賴
org.springframework.boot.experimental spring-boot-thin-maven-plugin ${thin.version} resolve resolve false
構(gòu)建項(xiàng)目后,目錄為target/thin/root/。
生產(chǎn)環(huán)境
生產(chǎn)環(huán)境中,大部分都是內(nèi)外網(wǎng)隔離的,建議先在本地“試運(yùn)行”,然后把repository目錄,瘦jar一起復(fù)制到服務(wù)器,設(shè)置thin.root指定目錄,設(shè)置thin.offline切換到“離線”模式。所有依賴項(xiàng)都必須在本地可用.
- java -Dthin.root=. -Dthin.offline=true -jar xxx.jar
參考:
https://www.liaoxuefeng.com/wiki/1252599548343744/1304267002478625
分享名稱:從零搭建開發(fā)腳手架SpringBoot應(yīng)用瘦身打包便于部署
網(wǎng)站網(wǎng)址:http://www.5511xx.com/article/djohesh.html


咨詢
建站咨詢
