偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

從零搭建開發(fā)腳手架 Spring Boot應(yīng)用瘦身打包便于部署

開發(fā) 架構(gòu)
Spring Boot 默認(rèn)打的Jar,包含應(yīng)用程序代碼及其所有依賴項(內(nèi)置tomcat jar就不小了),所以打包出來的jar文件很大,動不動就幾十,上百M,稱之為Fat jar。
本文轉(zhuǎn)載自微信公眾號「Java大廠面試官」,作者laker。轉(zhuǎn)載本文請聯(lián)系Java大廠面試官公眾號。
  • 背景
  • 使用
  • 工作原理
  • 額外補充
    • 運行應(yīng)用程序進(jìn)行預(yù)熱
    • 使用Maven在編譯期打包依賴項
    • 生產(chǎn)環(huán)境

背景

Spring Boot 默認(rèn)打的Jar,包含應(yīng)用程序代碼及其所有依賴項(內(nèi)置tomcat jar就不小了),所以打包出來的jar文件很大,動不動就幾十,上百M,稱之為Fat jar。

在網(wǎng)速不給力的情況下,上傳服務(wù)器非常耗時。然而,其中我們引用到的Tomcat、Spring以及其他第三方組件,它們大部分時間是不會修改的而且占用了很大的空間,每次打包打進(jìn)去。其實,我們經(jīng)常改動的內(nèi)容都是我們自己編寫的代碼,其大小大概也就幾十KB,每次升級我們只需替換這些文件即可。

Spring社區(qū)大概也考慮到了開發(fā)者有這樣的需求,所以提供了spring-boot-thin-launcher這個插件用來將項目的依賴和配置從jar包中分離出去。

使用

官網(wǎng)地址:https://github.com/spring-projects-experimental/spring-boot-thin-launcher

在Spring Boot pom文件中新增插件如下:

  1. <project ...> 
  2.     <build> 
  3.         <plugins> 
  4.             <plugin> 
  5.                 <groupId>org.springframework.boot</groupId> 
  6.                 <artifactId>spring-boot-maven-plugin</artifactId> 
  7.                 <dependencies> 
  8.                     <dependency> 
  9.                         <groupId>org.springframework.boot.experimental</groupId> 
  10.                         <artifactId>spring-boot-thin-layout</artifactId> 
  11.                         <version>1.0.27.RELEASE</version> 
  12.                     </dependency> 
  13.                 </dependencies> 
  14.             </plugin> 
  15.         </plugins> 
  16.     </build> 
  17. </project> 

 

 

 

 

 

 

然后還像以前一樣執(zhí)行mvn clean package,這時生成的jar包僅幾十KB。

我這里因為項目有很多靜態(tài)文件所以比較大有2MB。

執(zhí)行java -jar xxx.jar即可直接運行程序。

除了jar文件減小了,其他效果看著與Fat jar是一樣。

嘗鮮之后,來看下其內(nèi)部原理吧。

工作原理

我們來看下Jar包內(nèi)部的構(gòu)成。

  1. Manifest-Version: 1.0 
  2. Implementation-Title: map 
  3. Implementation-Version: 0.0.1-SNAPSHOT 
  4. Start-Class: com.laker.map.LakerMapApplication 
  5. Spring-Boot-Classes:  
  6. Build-Jdk-Spec: 1.8 
  7. Spring-Boot-Version: 2.3.7.RELEASE 
  8. Created-By: Maven Jar Plugin 3.2.0 
  9. Main-Class: org.springframework.boot.loader.wrapper.ThinJarWrapper 

即啟動類實際為:ThinJarWrapper

ThinJarWrapper類

我們編寫的代碼

項目的Pom文件

當(dāng)執(zhí)行java -jar xxx.jar時,實際執(zhí)行的是ThinJarWrapper,它會先在指定目錄搜索看看依賴的jar包是否都存在,存在則直接使用,如果不存在,先從Maven中央倉庫下載到本地,然后,再執(zhí)行我們自己編寫的main()入口方法。這種方式有點類似很多在線安裝程序:用戶下載后得到的是一個很小的exe安裝程序,執(zhí)行安裝程序時,會首先在線下載所需的若干巨大的文件,再進(jìn)行真正的安裝。

這個spring-boot-thin-launcher在啟動時搜索的默認(rèn)目錄是用戶主目錄的.m2,我們也可以指定下載目錄,例如,將下載目錄指定為當(dāng)前目錄:

  1. java -Dthin.root=. -jar xxx.jar 

執(zhí)行后發(fā)現(xiàn)當(dāng)前目錄下自動生成了一個repository目錄,這和Maven的默認(rèn)下載目錄~/.m2/repository的結(jié)構(gòu)是完全一樣的,只是它僅包含xxx.jar所需的運行期依賴項。

  1. repository/ 
  2.     com/ 
  3.     net/ 
  4.     org/ 
  5.     ... 

“注意:只有首次運行時會自動下載依賴項,再次運行時由于無需下載,所以啟動速度會大大加快。如果刪除了repository目錄,再次運行時就會再次觸發(fā)下載。

額外補充

運行應(yīng)用程序進(jìn)行預(yù)熱

緩存依賴項的最簡單方法是在目標(biāo)環(huán)境中對應(yīng)用程序進(jìn)行預(yù)熱運行。正如我們之前看到的,這將導(dǎo)致依賴項被下載并緩存在本地 Maven 存儲庫中。如果我們運行多個應(yīng)用程序,存儲庫最終將包含所有依賴項而沒有重復(fù)項。

由于運行應(yīng)用程序可能會產(chǎn)生不必要的副作用,我們還可以執(zhí)行“試運行”,只解析和下載依賴項,而無需運行任何用戶代碼:

  1. java -Dthin.dryrun=true -Dthin.root=. -jar xxx.jar 

使用Maven在編譯期打包依賴項

添加以下依賴

  1. <plugin> 
  2.     <groupId>org.springframework.boot.experimental</groupId> 
  3.     <artifactId>spring-boot-thin-maven-plugin</artifactId> 
  4.     <version>${thin.version}</version> 
  5.     <executions> 
  6.         <execution> 
  7.         <!-- Download the dependencies at build time --> 
  8.         <id>resolve</id> 
  9.         <goals> 
  10.             <goal>resolve</goal> 
  11.         </goals> 
  12.         <inherited>false</inherited> 
  13.         </execution> 
  14.     </executions> 
  15. </plugin> 

 

 

 

構(gòu)建項目后,目錄為target/thin/root/。

生產(chǎn)環(huán)境

生產(chǎn)環(huán)境中,大部分都是內(nèi)外網(wǎng)隔離的,建議先在本地“試運行”,然后把repository目錄,瘦jar一起復(fù)制到服務(wù)器,設(shè)置thin.root指定目錄,設(shè)置thin.offline切換到“離線”模式。所有依賴項都必須在本地可用.

  1. java -Dthin.root=. -Dthin.offline=true  -jar xxx.jar 

參考:

 

https://www.liaoxuefeng.com/wiki/1252599548343744/1304267002478625

 

責(zé)任編輯:武曉燕 來源: Java大廠面試官
相關(guān)推薦

2020-08-19 08:55:47

Redis緩存數(shù)據(jù)庫

2021-09-01 10:07:43

開發(fā)零搭建Groovy

2021-04-28 16:10:48

開發(fā)腳手架 Spring

2021-03-09 17:11:09

數(shù)據(jù)庫腳手架開發(fā)

2021-07-29 18:49:49

Spring開發(fā)腳手架

2021-03-11 14:16:47

Spring Boo開發(fā)腳手架

2021-05-13 17:02:38

MDC腳手架日志

2021-04-13 14:47:53

認(rèn)證授權(quán)Java

2021-04-20 19:24:16

腳手架 Java微信

2025-05-16 07:24:41

Springkafka腳手架

2021-06-02 17:58:49

腳手架 冪等性前端

2021-02-19 22:43:50

開發(fā)腳手架Controller

2020-06-29 11:35:02

Spring BootJava腳手架

2016-08-10 14:59:41

前端Javascript工具

2016-09-07 15:35:06

VueReact腳手架

2023-11-21 17:36:04

OpenFeignSentinel

2014-08-15 09:36:06

2021-01-07 05:34:07

腳手架JDK緩存

2018-06-11 14:39:57

前端腳手架工具node.js

2018-08-30 16:08:37

Node.js腳手架工具
點贊
收藏

51CTO技術(shù)棧公眾號