問題背景
Spring Boot 項目一般會依賴較多的包括 Spring 在內的第三方 jar 包,直接打可運行 jar 包,文件大小往往會達到100M甚至更大;
一個包含數個業務模塊的微服務項目,全部可運行的 jar 包加起來總共可達數百M甚至上G;
我們在重複部署測試或者生產環境的時候,每次都要上傳包含所有依賴 jar 包的可運行 jar 文件,效率比較低;
期望目標
下面是經過驗證的 maven 配置,Spring Boot 項目打包時,只包含我們自己的開發的代碼內容,大小僅僅之後數百 kb,所依賴的第三方 jar 則複製到指定的目錄下;
這樣我們可以只需要上傳一次第三方 jar,每次修改代碼重新部署時,只上傳僅包含我們開發代碼的 jar 文件,大大提高了部署效率。
解決方法
maven 的 pom 配置如下,${} 變量根據自己的項目進行替換,第三方 jar 指定到 target/lib 目錄下:
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- 跳過單元測試 -->
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<!-- 複製第三方 jar 到項目目錄下的 target/lib/ 下 -->
<execution>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeScope>provided</excludeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- 指定 Spring Boot 啓動類,實際測試中必須 -->
<mainClass>${project.main.class}</mainClass>
<!-- 將所有第三方 jar 添加到項目 jar 的 MANIFEST.MF 文件中,這樣運行 jar 時依賴包才能被加載 -->
<addClasspath>true</addClasspath>
<!-- 指定複製第三方 jar 的目標目錄爲 target/lib/-->
<classpathPrefix>./lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- repackage 時排除掉 第三方依賴 jar 文件,我們的可運行 Spring Boot 的 jar 文件瞬間變小 ^_^ -->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
</plugin>
</plugins>