spring boot項目fat jar瘦身的實現(xiàn)
一、項目背景
spring cloud構(gòu)建spring boot項目,精細化各項目的層次,達到降低耦合度的目的,項目間基于restful通信。
在對項目打包過程中,使用spring-boot-maven-plugin插件打包,生成的是fat jar,解壓該jar包,會發(fā)現(xiàn)項目依賴的jar包存放于BOOT-INF下的lib文件夾中,分析多個子項目后會發(fā)現(xiàn),相同的jar包占絕大多數(shù),然后每次部署于線上環(huán)境,各系統(tǒng)的共同jar在服務器上其實是重復擱置的,因此自然會想到是否有方法將共同的jar包,或是不經(jīng)常改動的jar包,抽離出來,整理出單獨的一份,然后由各子項目啟動時使用外部加載,達到fat jar瘦身的目的。
二、fat jar瘦身
經(jīng)過以上分析,及查閱相關(guān)資料,整理出以下步驟進行jar包瘦身:
1.各項目配置spring-boot-maven-plugin插件(官方文檔),生成fat jar中留存的jar包
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<!-- <excludeGroupIds>
org.springframework.boot,
org.springframework.cloud,
org.mybatis.spring.boot,
tk.mybatis,
mysql,
com.alibaba,
javax.persistence,
io.springfox,
org.springframework.session
</excludeGroupIds> -->
<includes>
<include>
<groupId>xx</groupId>
<artifactId>xx</artifactId>
</include>
<include>
<groupId>xx</groupId>
<artifactId>xx</artifactId>
</include>
</includes>
</configuration>
</plugin>
如以上代碼,可以使用excludeGroupIds,或者includes,或其他標簽,具體看情況。
2.在項目依賴jar中抽離出不想存放于fat jar的jar包。
方法一(推薦):在項目pom文件中添加maven依賴插件(官方文檔)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- <outputDirectory>E:/lib</outputDirectory> -->
<excludeGroupIds>
<!-- 留存于fat jar中的jar包的groupId屬性值(多個,分隔)-->
</excludeGroupIds>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
標簽具體含義查看官方文檔。
使用maven對項目進行打包時,使用maven命令:
mvn clean install -Dmaven.test.skip=true -DoutputDirectory=E:/lib(-DoutputDirectory=E:/lib是命令動態(tài)指定項目依賴的jar包導出的路徑,若在項目中指定了outputDirectory的標簽值,則將覆蓋此動態(tài)路徑)
配置插件執(zhí)行此命令后,項目中除excludeGroupIds標簽中配置的jar包外,其余都將導入到指定目錄中,至此完成抽離fat jar中多余的jar包。
方法二:項目中不添加maven依賴插件,直接在對項目使用mvn復制依賴jar包的命令,這種方式需要挨個對各個子項目進行依賴復制,子項目少可以使用。
mvn dependency:copy-dependencies -DoutputDirectory=E:/lib(若無動態(tài)指定目錄,默認在項目的target路徑下生成dependency目錄)
將各項目導出的依賴jar包,統(tǒng)一放入一個文件夾中,去除重復,并刪除fat jar中預留存的依賴jar包,至此完成抽離fat jar中多余的jar包。
3.將抽離出的jar包,放置服務器某一路徑下,配置項目啟動腳本,進行外部加載。
nohup java -Dloader.path="xx/lib" -jar xx.jar
-Dloader.path即外部加載地址。
至此瘦身完畢,可以在項目打包后的jar包看到,BOOT-INF下的lib中,僅有所需的jar包,大大減少了fat jar的大小。
pom的配置可以通用于微服務體系中,形成統(tǒng)一的配置,各個項目中的jar包依賴關(guān)系視具體情況更改。
三、遇到的問題及解決辦法
在瘦身過程中,并不是一帆風順的,當我認為大功告成,啟動項目時,發(fā)現(xiàn)啟動失敗,jar沖突。
1.解決jar包沖突,通過mvn命令分析jar包的依賴關(guān)系,并找到?jīng)_突jar包,并統(tǒng)一版本。
在eclipse中,創(chuàng)建新Maven Build,一開始我嘗試了mvn dependency:tree,整體分析一遍jar包依賴,但并沒有找到問題jar包的依賴關(guān)系,接著我嘗試了mvn dependency:tree -Dverbose,將所有間接的隱性的依賴也分析了一遍仍未找到問題jar包的依賴關(guān)系。
至此,我懷疑項目中沒有這個jar包,反復打包后,我看到,此問題jar包的確在項目依賴中,只是隱藏的太深。于是,只能針對單個jar包進行分析:
mvn dependency:tree -Dverbose -Dincludes=xx:xx:xx(xx:xx:xx對應jar包的groupId:artifactId:version)
使用Dincludes后,找到了對應jar包的依賴關(guān)系,并在項目中排除了該jar包,再次打包后項目啟動成功,問題解決。
2.打包過程中,一些細分的子項目,并未使用spring-boot-maven-plugin插件,而是使用maven-jar-plugin直接打包成一個可運行jar,再結(jié)合了fat jar瘦身配置后發(fā)現(xiàn),原本可以依賴互通的jar,現(xiàn)在失效了。由于fat jar瘦身后的lib中,僅剩代碼經(jīng)常改動的項目的jar,依賴關(guān)系在可運行jar中,并未傳遞,因此需要在本項目中顯性依賴所需的項目的jar包,才能保證項目的完整。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳述IntelliJ IDEA提交代碼前的 Code Analysis 機制(小結(jié))
本篇文章主要介紹了詳述IntelliJ IDEA提交代碼前的 Code Analysis 機制(小結(jié)),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-11-11
淺談springmvc的DispatcherServlet分析
本篇文章主要介紹了淺談springmvc的DispatcherServlet分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
spring boot 防止重復提交實現(xiàn)方法詳解
這篇文章主要介紹了spring boot 防止重復提交實現(xiàn)方法,結(jié)合實例形式詳細分析了spring boot 防止重復提交具體配置、實現(xiàn)方法及操作注意事項,需要的朋友可以參考下2019-11-11
Java使用EasyExcel實現(xiàn)高效的Excel讀寫操作
在日常開發(fā)中,Excel 文件的讀寫操作是一個常見的需求,EasyExcel 是阿里巴巴開源的一個高性能、易用的 Excel 讀寫庫,可以大幅提高處理 Excel 文件的效率,本篇博客將從 EasyExcel 的基本概念、優(yōu)勢、安裝、讀寫操作以及高級用法展開,需要的朋友可以參考下2024-12-12
IDEA項目maven?project沒有出現(xiàn)plugins和Dependencies問題
這篇文章主要介紹了IDEA項目maven?project沒有出現(xiàn)plugins和Dependencies問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
Spring中的BeanFactory與FactoryBean區(qū)別詳解
這篇文章主要介紹了Spring中的BeanFactory與FactoryBean區(qū)別詳解,BeanFactory是一個接口,它是spring中的一個工廠,FactoryBean也是一個接口,實現(xiàn)了3個方法,通過重寫其中方法自定義生成bean,需要的朋友可以參考下2024-01-01

