夏天到了,來給jar包瘦個身!

welchang發表於2021-09-09

工作中終於遇到比較好玩的東西了,最近被給了一個需求,將pom中的第三方依賴移到外面而不直接打包進jar包。直接打包有什麼問題嗎

直接打包的缺點

列一下直接打包的三宗罪!!!

  • 如果專案依賴的第三方包非常多,那麼最終提供出去的jar包將非常大,上傳將非常費時
  • 如果依賴的某個第三方包有安全漏洞,那麼必須換版本,換版本的話就必須重新進行打包。曾經就暴露出fastjson的安全漏洞,版本小於1.2.68存在反序列化的漏洞
  • 如果依賴的第三方包版本升級了,想直接用最新的版本就只能修改版本然後重新打包了

第二點和第三點差不多,都是由版本導致重新打包
但是我們打包時不將依賴的第三方包打包進去,那麼最後的jar包不僅小,而且當依賴的第三方版本發生變化時不需要重新打包了

圖片描述

既然排除第三方包可以帶來這麼多好處,心動不如行動,趕緊對自己的專案大刀闊斧改造一下吧

pom檔案的修改

在maven專案中配置打包相關的東西是在pom檔案中的,如果不需要將第三方包排除在外,通常在pom中都是這樣配置的

authsdk-service-${version}org.springframework.bootspring-boot-maven-pluginauthsdk-service-${version}repackageorg.apache.maven.pluginsmaven-compiler-plugin${project.build.sourceEncoding}8<source>8
複製程式碼

打包後看一下打包後jar包的大小

圖片描述

大小為27515KB,檢視一下jar包的內容,會發現在BOOT-INF/lib目錄下都是依賴的第三方包

圖片描述

很明顯,這些依賴的第三方包是導致打包出來的jar包大的原因
現在要對pom檔案做一個改動,使其不將第三方依賴打包進去,修改後的配置

 authsdk-service-${version}org.springframework.bootspring-boot-maven-plugin<!-- 此處為專案的主類路徑 --&gtcom.xxx.authsdk.AuthsdkServiceApplicationZIP<!-- 排除所有的第三方依賴的Jar包 --&gtnothingnothingrepackageorg.apache.maven.pluginsmaven-compiler-plugin8<source>8
複製程式碼

修改完後重新打包

圖片描述

jar包大小變為1702KB,是原來的50分之3,瘦身效果很明顯!!!
同時檢視jar包內容/BOOT-INF下沒有lib資料夾了,確實沒有將第三方依賴打包進去了
你以為到這裡就完了嗎,不,還可以做的更好!因為打包時沒有將第三方依賴打包進去,因此啟動的時候需要指定第三方依賴的位置程式才能正常啟動,這就必須要求我們必須保從最開始未瘦身的jar包中將lib資料夾給摳出來,這樣的做法就稍微有點low了。maven提供了一種顯示指定lib資料夾儲存路徑的方法,在之前的pom檔案基礎上加下如下配置

org.apache.maven.pluginsmaven-dependency-plugincopy-dependencies<!-- 複製第三方 jar 到指定路徑下 下 --&gtG:/java工程/authorize_service/libprovided<!-- 配置的作用:跳過複製第三方依賴這一步。這是在首次上傳
                第三方依賴到伺服器之後,啟用這個選項,可以不用在打包時
                重複複製,節省時間。--&gtfalse
複製程式碼

透過指定lib目錄儲存路徑為當前專案路徑下

專案啟動

因為沒有將第三方依賴打包進去,因此啟動時必須顯示指定第三方依賴路勁

  • 相對路徑:java -Dloader.path=lib -jar xxx.jar
  • 絕對路徑:java -Dloader.path=/xxx/lib -jar xxx.jar

作者:何甜甜在嗎
連結:
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4830/viewspace-2797597/,如需轉載,請註明出處,否則將追究法律責任。

相關文章