maven jar包瘦身
springCloud項目系統(tǒng)瘦身記錄
第一章
**嘗試spring-boot-thin-launcher**Spring Boot項目可以通過spring-boot-maven-plugin插件打包生成一個可執(zhí)行的jar包,這樣可以脫離web容器(例如tomcat)直接運行。但默認情況下spring-boot-maven-plugin打出來的包是一個fat jar,即將所有的依賴全部打進了jar包當中,這樣的jar包體積很大,每次更新系統(tǒng)的時候都需要完整替換整個jar包(本地還好,如果是云服務器,網(wǎng)速慢了每次上傳文件都想砸電腦π__π)。此外,系統(tǒng)切換環(huán)境時,也同時需要切換配置參數(shù),雖然可以使用配置中心或者利用命令行參數(shù)修改配置,但有時候也免不了直接需要修改配置文件,這樣的話就有必要將配置文件從jar包中分離出來,單獨存放。
Spring社區(qū)大概也考慮到了部分開發(fā)者有這樣的需求,所以提供了spring-boot-thin-launcher這個插件用來將項目的依賴和配置從jar包中分離出去。這個插件是放在spring-projects-experimental
使用方法
<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><dependencies><dependency><!-- 加入該配置,使用maven package,依賴jar不會打包在項目最終jar文件內(nèi) --><groupId>org.springframework.boot.experimental</groupId><artifactId>spring-boot-thin-layout</artifactId><version>1.0.23.RELEASE</version></dependency></dependencies></plugin><!-- 加入該配置,maven package執(zhí)行時會在target目錄整理好依賴包 --><plugin><groupId>org.springframework.boot.experimental</groupId><artifactId>spring-boot-thin-maven-plugin</artifactId><version>1.0.23.RELEASE</version><executions><execution><!-- Download the dependencies at build time --><id>resolve</id><goals><goal>resolve</goal></goals><inherited>false</inherited></execution></executions></plugin>加入以上插件打包時僅會打包代碼部分不會去將依賴打包進jar包,所以我們打出來的文件就會很小
代碼中第二個插件起到的作用就是將對應的依賴包打包進上圖中thin文件夾里面,在jar包啟動時指定thin里面的路徑即可完美的啟動jar 例:(java -Dthin.root=path/to/lib -jar spring-boot-app.jar)
問題:在自己創(chuàng)建的demo中實驗沒什么問題,因為最終是公司的正式項目(SpringCloud項目)需要進行jar瘦身,所以在測試環(huán)境進行實驗時總是會報錯目測是和連接池有沖突具體原因沒找到所以感覺這個插件可能不太適合 ,下面介紹另外一種方式
第二章
配置可執(zhí)行jar包中Main-Class的類型,使打的jar包中的Main-Class為PropertiesLauncher 。
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><layout>ZIP</layout><includes><include><groupId>nothing</groupId><artifactId>nothing</artifactId></include></includes></configuration></plugin></plugins></build>注意
一、這里layout一定要設置為 ZIP
二、includes 是將需要保留的jar包,按照groupId和artifactId(注意兩個都是必填項)include進來。
nothing 代表不存在的依賴包,意思就是什么依賴包都不引入
將插件引入后進行打包操作
通過壓解工具查看jar包里面META-INF目錄下的MANIFEST.MF文件:
發(fā)現(xiàn)Main-Class的值確實變?yōu)榱薖ropertiesLauncher ,說明我們的配置成功。
下圖為jar大小對比
將jar 放入測試服務器配置好對應的啟動文件啟動
完美運行
原理探究
為什么將可執(zhí)行jar包的Main-Class設置為PropertiesLauncher就可以通過配置啟動參數(shù)loader.path指定依賴包的加載路徑呢?
首先我們對spring boot可執(zhí)行jar包實現(xiàn)原理中的啟動器Launcher有所了解。
以下摘自spring boot官網(wǎng)
:
org.springframework.boot.loader.Launcher類是特殊的引導程序類,用作可執(zhí)行jar的主要入口點。它是jar文件中的實際Main-Class,用于設置適當?shù)腢RLClassLoader并最終調(diào)用main()方法。
有三個啟動器子類(JarLauncher,WarLauncher和PropertiesLauncher)。它們的目的是從目錄中的嵌套jar文件或war文件(而不是在類路徑中顯式的文件)加載資源(.class文件等)。對于JarLauncher和WarLauncher,嵌套路徑是固定的。 JarLauncher位于BOOT-INF / lib /中,而WarLauncher位于WEB-INF / lib /和WEB-INF / lib-provided /中。如果需要,可以在這些位置添加額外的罐子。默認情況下,PropertiesLauncher在您的應用程序存檔中的BOOT-INF / lib /中查找。您可以通過在loader.properties(這是目錄,歸檔文件或歸檔文件中的目錄的逗號分隔列表)中設置一個稱為LOADER_PATH或loader.path的環(huán)境變量來添加其他位置。
也就是說啟動器Launcher是為了項目啟動加載依賴資源的,共有3個啟動器(JarLauncher,WarLauncher和PropertiesLauncher),其中JarLauncher和WarLauncher加載資源的路徑是固定的,而PropertiesLauncher可以通過環(huán)境變量loader.path來指定加載資源的位置。
layout屬性值說明:
JAR,即通常的可執(zhí)行jar
Main-Class: org.springframework.boot.loader.JarLauncher
WAR,即通常的可執(zhí)行war,需要的servlet容器依賴位于
Main-Class: org.springframework.boot.loader.warLauncher
ZIP,即DIR,類似于JAR
Main-Class: org.springframework.boot.loader.PropertiesLauncher
(記住這個就好,其他的應用場景比較少)
PropertiesLauncher屬性配置
PropertiesLauncher具有一些可以通過外部屬性(系統(tǒng)屬性,環(huán)境變量,清單條目或loader.properties)啟用的特殊功能。 下表描述了這些屬性:
| loader.path | lib包加載路徑 |
| loader.home | 用于解析loader.path中的相對路徑。 例如,給定loader.path = lib,則$ {loader.home} / lib是類路徑位置(以及該目錄中的所有jar文件)。 此屬性還用于查找loader.properties文件,如以下示例/ opt / app所示。它默認為$ {user.dir}。 |
| loader.args | main方法的默認參數(shù)(以空格分隔)。 |
| loader.main | 要啟動的主類的名稱(例如com.app.Application) |
| loader.config.name | 屬性文件的路徑(例如,classpath:loader.properties)。 默認為loader.properties。 |
| loader.system | 布爾值標志,指示應將所有屬性添加到系統(tǒng)屬性。 默認為false。 |
參考鏈接:https://blog.csdn.net/w1014074794/article/details/106445145
總結
以上是生活随笔為你收集整理的maven jar包瘦身的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机桌面清理用于什么,C盘哪些文件可以
- 下一篇: Xcode 工程清理瘦身