国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

spring boot項目fat jar瘦身的實現

2024-07-14 08:41:11
字體:
來源:轉載
供稿:網友

一、項目背景

spring cloud構建spring boot項目,精細化各項目的層次,達到降低耦合度的目的,項目間基于restful通信。

在對項目打包過程中,使用spring-boot-maven-plugin插件打包,生成的是fat jar,解壓該jar包,會發現項目依賴的jar包存放于BOOT-INF下的lib文件夾中,分析多個子項目后會發現,相同的jar包占絕大多數,然后每次部署于線上環境,各系統的共同jar在服務器上其實是重復擱置的,因此自然會想到是否有方法將共同的jar包,或是不經常改動的jar包,抽離出來,整理出單獨的一份,然后由各子項目啟動時使用外部加載,達到fat jar瘦身的目的。

二、fat jar瘦身

經過以上分析,及查閱相關資料,整理出以下步驟進行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是命令動態指定項目依賴的jar包導出的路徑,若在項目中指定了outputDirectory的標簽值,則將覆蓋此動態路徑)

配置插件執行此命令后,項目中除excludeGroupIds標簽中配置的jar包外,其余都將導入到指定目錄中,至此完成抽離fat jar中多余的jar包。

方法二:項目中不添加maven依賴插件,直接在對項目使用mvn復制依賴jar包的命令,這種方式需要挨個對各個子項目進行依賴復制,子項目少可以使用。

mvn dependency:copy-dependencies -DoutputDirectory=E:/lib(若無動態指定目錄,默認在項目的target路徑下生成dependency目錄)

將各項目導出的依賴jar包,統一放入一個文件夾中,去除重復,并刪除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的配置可以通用于微服務體系中,形成統一的配置,各個項目中的jar包依賴關系視具體情況更改。

三、遇到的問題及解決辦法

在瘦身過程中,并不是一帆風順的,當我認為大功告成,啟動項目時,發現啟動失敗,jar沖突。

1.解決jar包沖突,通過mvn命令分析jar包的依賴關系,并找到沖突jar包,并統一版本。

在eclipse中,創建新Maven Build,一開始我嘗試了mvn dependency:tree,整體分析一遍jar包依賴,但并沒有找到問題jar包的依賴關系,接著我嘗試了mvn dependency:tree -Dverbose,將所有間接的隱性的依賴也分析了一遍仍未找到問題jar包的依賴關系。

至此,我懷疑項目中沒有這個jar包,反復打包后,我看到,此問題jar包的確在項目依賴中,只是隱藏的太深。于是,只能針對單個jar包進行分析:

mvn dependency:tree -Dverbose -Dincludes=xx:xx:xx(xx:xx:xx對應jar包的groupId:artifactId:version)

使用Dincludes后,找到了對應jar包的依賴關系,并在項目中排除了該jar包,再次打包后項目啟動成功,問題解決。

2.打包過程中,一些細分的子項目,并未使用spring-boot-maven-plugin插件,而是使用maven-jar-plugin直接打包成一個可運行jar,再結合了fat jar瘦身配置后發現,原本可以依賴互通的jar,現在失效了。由于fat jar瘦身后的lib中,僅剩代碼經常改動的項目的jar,依賴關系在可運行jar中,并未傳遞,因此需要在本項目中顯性依賴所需的項目的jar包,才能保證項目的完整。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 京山县| 衡水市| 卢氏县| 红桥区| 浙江省| 青岛市| 凉山| 西乌| 漠河县| 理塘县| 略阳县| 鄂温| 澜沧| 怀安县| 伊宁市| 河西区| 灌南县| 都昌县| 台中市| 普安县| 永泰县| 东源县| 大宁县| 布拖县| 灵丘县| 京山县| 鲁甸县| 日土县| 吉木萨尔县| 辉南县| 龙陵县| 左云县| 六枝特区| 壤塘县| 安图县| 定州市| 鄱阳县| 甘肃省| 海门市| 固镇县| 义马市|