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

成都創(chuàng)新互聯(lián)一直在為企業(yè)提供服務(wù),多年的磨煉,使我們?cè)趧?chuàng)意設(shè)計(jì),全網(wǎng)整合營(yíng)銷推廣到技術(shù)研發(fā)擁有了開發(fā)經(jīng)驗(yàn)。我們擅長(zhǎng)傾聽企業(yè)需求,挖掘用戶對(duì)產(chǎn)品需求服務(wù)價(jià)值,為企業(yè)制作有用的創(chuàng)意設(shè)計(jì)體驗(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ī)移動(dòng)建站、網(wǎng)頁設(shè)計(jì)、網(wǎng)絡(luò)整合營(yíng)銷。
- 背景
- 使用
- 工作原理
- 額外補(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文件很大,動(dòng)不動(dòng)就幾十,上百M(fèi),稱之為Fat jar。
在網(wǎng)速不給力的情況下,上傳服務(wù)器非常耗時(shí)。然而,其中我們引用到的Tomcat、Spring以及其他第三方組件,它們大部分時(shí)間是不會(huì)修改的而且占用了很大的空間,每次打包打進(jìn)去。其實(shí),我們經(jīng)常改動(dòng)的內(nèi)容都是我們自己編寫的代碼,其大小大概也就幾十KB,每次升級(jí)我們只需替換這些文件即可。
Spring社區(qū)大概也考慮到了開發(fā)者有這樣的需求,所以提供了spring-boot-thin-launcher這個(gè)插件用來將項(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,這時(shí)生成的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
即啟動(dòng)類實(shí)際為:ThinJarWrapper
ThinJarWrapper類
我們編寫的代碼
項(xiàng)目的Pom文件
當(dāng)執(zhí)行java -jar xxx.jar時(shí),實(shí)際執(zhí)行的是ThinJarWrapper,它會(huì)先在指定目錄搜索看看依賴的jar包是否都存在,存在則直接使用,如果不存在,先從Maven中央倉(cāng)庫(kù)下載到本地,然后,再執(zhí)行我們自己編寫的main()入口方法。這種方式有點(diǎn)類似很多在線安裝程序:用戶下載后得到的是一個(gè)很小的exe安裝程序,執(zhí)行安裝程序時(shí),會(huì)首先在線下載所需的若干巨大的文件,再進(jìn)行真正的安裝。
這個(gè)spring-boot-thin-launcher在啟動(dòng)時(shí)搜索的默認(rèn)目錄是用戶主目錄的.m2,我們也可以指定下載目錄,例如,將下載目錄指定為當(dāng)前目錄:
- java -Dthin.root=. -jar xxx.jar
執(zhí)行后發(fā)現(xiàn)當(dāng)前目錄下自動(dòng)生成了一個(gè)repository目錄,這和Maven的默認(rèn)下載目錄~/.m2/repository的結(jié)構(gòu)是完全一樣的,只是它僅包含xxx.jar所需的運(yùn)行期依賴項(xiàng)。
- repository/
- com/
- net/
- org/
- ...
“注意:只有首次運(yùn)行時(shí)會(huì)自動(dòng)下載依賴項(xiàng),再次運(yùn)行時(shí)由于無需下載,所以啟動(dòng)速度會(huì)大大加快。如果刪除了repository目錄,再次運(yùn)行時(shí)就會(huì)再次觸發(fā)下載。
額外補(bǔ)充
運(yùn)行應(yīng)用程序進(jìn)行預(yù)熱
緩存依賴項(xiàng)的最簡(jiǎn)單方法是在目標(biāo)環(huán)境中對(duì)應(yīng)用程序進(jìn)行預(yù)熱運(yùn)行。正如我們之前看到的,這將導(dǎo)致依賴項(xiàng)被下載并緩存在本地 Maven 存儲(chǔ)庫(kù)中。如果我們運(yùn)行多個(gè)應(yīng)用程序,存儲(chǔ)庫(kù)最終將包含所有依賴項(xiàng)而沒有重復(fù)項(xiàng)。
由于運(yùn)行應(yīng)用程序可能會(huì)產(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
當(dāng)前文章:從零搭建開發(fā)腳手架SpringBoot應(yīng)用瘦身打包便于部署
當(dāng)前鏈接:http://www.dlmjj.cn/article/djohesh.html


咨詢
建站咨詢
