成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從零搭建開發腳手架 Spring Boot應用瘦身打包便于部署

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

背景

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

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

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

使用

官網地址: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> 

 

 

 

 

 

 

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

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

執行java -jar xxx.jar即可直接運行程序。

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

嘗鮮之后,來看下其內部原理吧。

工作原理

我們來看下Jar包內部的構成。

  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文件

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

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

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

執行后發現當前目錄下自動生成了一個repository目錄,這和Maven的默認下載目錄~/.m2/repository的結構是完全一樣的,只是它僅包含xxx.jar所需的運行期依賴項。

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

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

額外補充

運行應用程序進行預熱

緩存依賴項的最簡單方法是在目標環境中對應用程序進行預熱運行。正如我們之前看到的,這將導致依賴項被下載并緩存在本地 Maven 存儲庫中。如果我們運行多個應用程序,存儲庫最終將包含所有依賴項而沒有重復項。

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

  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> 

 

 

 

構建項目后,目錄為target/thin/root/。

生產環境

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

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

參考:

 

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

 

責任編輯:武曉燕 來源: Java大廠面試官
相關推薦

2020-08-19 08:55:47

Redis緩存數據庫

2021-09-01 10:07:43

開發零搭建Groovy

2021-04-28 16:10:48

開發腳手架 Spring

2021-03-09 17:11:09

數據庫腳手架開發

2021-07-29 18:49:49

Spring開發腳手架

2021-03-11 14:16:47

Spring Boo開發腳手架

2021-05-13 17:02:38

MDC腳手架日志

2021-04-13 14:47:53

認證授權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

開發腳手架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技術棧公眾號

主站蜘蛛池模板: 午夜在线视频一区二区三区 | 91社区视频 | 久久久精品视频免费 | 中文字幕在线视频一区二区三区 | 久久久久国产精品午夜一区 | 成人在线一级片 | 玖玖综合网 | 国产精品一区二区三 | 日韩一区不卡 | 日本不卡一区二区三区在线观看 | 午夜成人免费视频 | 黄色欧美视频 | 狠狠色综合久久丁香婷婷 | 欧美久久一级 | 一区二区三区在线免费 | 91精品国产综合久久久久 | 欧美激情久久久 | 欧美精品v国产精品v日韩精品 | 作爱视频免费看 | 日本免费在线观看视频 | 亚洲精品字幕 | 免费在线观看av片 | 久久精品久久久久久 | 一区二区三区亚洲 | 中国三级黄色录像 | 一区二区在线 | 在线观看免费毛片 | 久久婷婷国产香蕉 | 精品一区二区三区在线观看国产 | 伊人中文字幕 | 国产精品久久久久久久久久免费看 | 99久久精品国产毛片 | 成人高清视频在线观看 | 激情五月婷婷在线 | 天天操夜夜爽 | 国产精品视频在线观看 | 国产成人精品网站 | 成人国产精品久久 | av黄色在线播放 | 亚洲一区二区三区在线免费观看 | 中文字幕免费在线 |