解決SpringBoot jar包太大的問題

轉載 2017年09月18日 09:21:53

SpringBoot的web應用通常都添加了spring-boot-maven-plugin插件.html

Maven xml代碼   收藏代碼
  1. <build>  
  2.     <plugins>  
  3.         <plugin>  
  4.             <groupId>org.springframework.boot</groupId>  
  5.             <artifactId>spring-boot-maven-plugin</artifactId>  
  6.         </plugin>  
  7.     </plugins>  
  8. </build>  

打出來的jar包內置了全部的依賴jar, 放在BOOT-INF/lib目錄, 因此體積很大.java

 

 

解決步驟:web

1. 修改spring-boot-maven-plugin的參數, 使其將內置的jar包exclude掉, 例如:spring

Xml代碼   收藏代碼
  1. <plugin>  
  2.    <groupId>org.springframework.boot</groupId>  
  3.    <artifactId>spring-boot-maven-plugin</artifactId>  
  4.    <version>1.5.1.RELEASE</version>  
  5.    <configuration>  
  6.       <layout>ZIP</layout>  
  7.        <excludes>  
  8.            <exclude>  
  9.                <groupId>ch.qos.logback</groupId>  
  10.                <artifactId>logback-classic</artifactId>  
  11.            </exclude>  
  12.            <exclude>  
  13.                <groupId>com.google.guava</groupId>  
  14.                <artifactId>guava</artifactId>  
  15.            </exclude>  
  16.        </excludes>  
  17.    </configuration>  
  18. </plugin>  

這樣, 打出來的jar中就不會包含被exclude掉的依賴了.注意layout應設置爲ZIP,否則後面會出現找不到類的錯誤.docker

exclude不止一種寫法, 其餘的exclude方式參見http://docs.spring.io/spring-boot/docs/current/maven-plugin/start-mojo.html.springboot

 

能夠經過mvn dependency:tree命令查看當前項目的依賴.maven

 

由於依賴的jar已經被排除掉了, FatJar變瘦, 直接運行就會報ClassNotFoundException. 因此還要進行下一步.spring-boot

 

能夠在公司的parent pom.xml的pluginManagement部分添加spring-boot-maven-plugin的配置, 這樣每一個web項目就能夠繼承一套全公司統一的配置.post

 

2. 將上一步exclude掉的jar放到一個外置的目錄中. 如:測試

而後執行以下命令啓動應用:

Cmd代碼   收藏代碼
  1. java -Dloader.path="lib/" -jar common-service.jar  

loader.path指向了外置目錄,告訴springboot容許從外部加載依賴. 

loader.path的更多用法參見:http://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable-jar-launching.

 

能夠用mvn dependency:copy-dependencies命令將jar包copy到這個外置目錄.

 

經測試, 通過上面的兩個步驟, 筆者的應用從70MB縮小爲1.3MB, 極大地縮小了體積.

 

既縮小了體積, 便於傳輸, 又很容易地控制依賴jar的版本, 作到全公司統一, 共享同一套依賴集合.

 

特別地, 若是要講應用部署到docker中, 須要修改dockerfile, 將依賴目錄掛載到docker鏡像中, 修改應用的啓動命令(可能會是dockerfile的entrypoint),添加loader.path參數, 指向掛載進來的依賴目錄. 不建議將依賴ADD到docker鏡像, 那樣的話docker鏡像會很大.

 

 

http://rickgong.iteye.com/blog/2368985

相關文章
相關標籤/搜索