spring cloud構建spring boot項目,精細化各項目的層次,達到下降耦合度的目的,項目間基於restful通訊。html
在對項目打包過程當中,使用spring-boot-maven-plugin插件打包,生成的是fat jar,解壓該jar包,會發現項目依賴的jar包存放於BOOT-INF下的lib文件夾中,分析多個子項目後會發現,相同的jar包占絕大多數,而後每次部署於線上環境,各系統的共同jar在服務器上實際上是重複擱置的,所以天然會想到是否有方法將共同的jar包,或是不常常改動的jar包,抽離出來,整理出單獨的一份,而後由各子項目啓動時使用外部加載,達到fat jar瘦身的目的。java
通過以上分析,及查閱相關資料,整理出如下步驟進行jar包瘦身:mysql
1.各項目配置spring-boot-maven-plugin插件(官方文檔),生成fat jar中留存的jar包spring
<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,或其餘標籤,具體看狀況。sql
2.在項目依賴jar中抽離出不想存放於fat jar的jar包。apache
方法一(推薦):在項目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>
標籤具體含義查看官方文檔。restful
使用maven對項目進行打包時,使用maven命令:session
mvn clean install -Dmaven.test.skip=true -DoutputDirectory=E:/lib(-DoutputDirectory=E:/lib是命令動態指定項目依賴的jar包導出的路徑,若在項目中指定了outputDirectory的標籤值,則將覆蓋此動態路徑)mybatis
配置插件執行此命令後,項目中除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包,才能保證項目的完整。