簡介
Spring Boot Maven Plugin插件提供spring boot在maven中的支持。允許你打包可運行的jar包或war包。
插件提供了幾個maven目標和Spring Boot 應用一起工作。總的有:
- spring-boot:repackage 請閱讀:Spring cloud的Maven插件(一):repackage目標
- spring-boot:run 請閱讀:Spring cloud的Maven插件(二):run目標
- spring-boot:start and spring-boot:stop
- spring-boot:build-info
repackage:創建一個自動可執行的jar或war文件。它可以替換常規的artifact,或者用一個單獨的classifier附屬在maven構建的生命周期中。
下面我們詳細看下repackage這個目標。
一、簡單引用
用了重新打包應用程序,我們需要在pom.xml文件中加一個簡單的引用到Spring Boot Maven Plugin插件中,代碼如下:repaceage 最簡單的結構

1 <build> 2 ... 3 <plugins> 4 ... 5 <plugin> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-maven-plugin</artifactId> 8 <version>1.5.7.RELEASE</version> 9 <executions> 10 <execution> 11 <goals> 12 <goal>repackage</goal> 13 </goals> 14 </execution> 15 </executions> 16 </plugin> 17 ... 18 </plugins> 19 ... 20 </build>
二、剔除不需要的依賴
這個例子重新打包了一個jar包或war包,這個jar包或war包被構建於maven生命周期的package階段,包括定義在工程中的任何依賴(包括scope為provided)。如果有一些依賴模塊需要被排除掉,可以使用一個exclude的選項。
默認情況下,repackage和run這兩個maven目標會包括定義在工程中的任何依賴。一些依賴被要求從可執行jar包中排除。下面有三種方式可以在包運行時排除依賴模塊。
方式1::排除一個具體的maven 模塊,通過唯一的groupId和artifactId組合來實現。(如果有必要,可以加入classifier來唯一確認。)

1 <project> 2 ... 3 <build> 4 ... 5 <plugins> 6 ... 7 <plugin> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-maven-plugin</artifactId> 10 <version>1.5.6.RELEASE</version> 11 <configuration> 12 <excludes> 13 <exclude> 14 <groupId>com.foo</groupId> 15 <artifactId>bar</artifactId> 16 </exclude> 17 </excludes> 18 </configuration> 19 ... 20 </plugin> 21 ... 22 </plugins> 23 ... 24 </build> 25 ... 26 </project>
方式2:排除和“指定的artifactId”相符的所有maven模塊。

1 <project> 2 ... 3 <build> 4 ... 5 <plugins> 6 ... 7 <plugin> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-maven-plugin</artifactId> 10 <version>1.5.6.RELEASE</version> 11 <configuration> 12 <excludeArtifactIds>my-lib,another-lib</excludeArtifactIds> 13 </configuration> 14 ... 15 </plugin> 16 ... 17 </plugins> 18 ... 19 </build> 20 ... 21 </project>
方式3:排除屬於“指定的groupId”的所有maven模塊。

1 <project> 2 ... 3 <build> 4 ... 5 <plugins> 6 ... 7 <plugin> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-maven-plugin</artifactId> 10 <version>1.5.6.RELEASE</version> 11 <configuration> 12 <excludeGroupIds>com.foo</excludeGroupIds> 13 </configuration> 14 ... 15 </plugin> 16 ... 17 </plugins> 18 ... 19 </build> 20 ... 21 </project>
三、重寫manifest
這個插件還可以重寫項目的manifest (可運行jar包的MANIFEST.MF),特別是管理Main-Class和Start-Class啟動類。如果默認的配置不能滿足需求,我們可以在這里做配置。通過插件的layout屬性可以確實地控制Main-Class。

1 <build> 2 ... 3 <plugins> 4 ... 5 <plugin> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-maven-plugin</artifactId> 8 <version>1.5.7.RELEASE</version> 9 <configuration> 10 <mainClass>${start-class}</mainClass> 11 <layout>ZIP</layout> 12 </configuration> 13 <executions> 14 <execution> 15 <goals> 16 <goal>repackage</goal> 17 </goals> 18 </execution> 19 </executions> 20 </plugin> 21 ... 22 </plugins> 23 ... 24 </build>
執行打包命令:mvn package spring-boot:repackage。注意:這里不能寫成mvn spring-boot:repackage。否則會報Source must refer to an existing file異常。
layout屬性默認根據archive type(jar or war)而定。總的有5中類型:
- JAR:常規的可執行jar包的布局。
- WAR:可執行war包的布局。
- ZIP(和DIR一樣):和使用PropertiesLauncher的jar包布局一樣。
- MODULE:包括依賴包(排除scope為provided的依賴包)和項目資源
- NONE:包括所有的依賴包和項目資源。
四、利用classifier分離代碼包和依賴包
當自己寫項目需要發布出去給別人依賴時,就只需要自己寫的代碼打包,依賴的包不能打進來。否則最后別人在用你提供的包時,就會出現重復包,導致最后打包時包會非常巨大。
在這個Spring Boot Maven Plugin這個插件下,我們只需要提供classifier即可實現這個功能。具體如下:

1 <project> 2 ... 3 <build> 4 ... 5 <plugins> 6 ... 7 <plugin> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-maven-plugin</artifactId> 10 <version>1.5.7.RELEASE</version> 11 <executions> 12 <execution> 13 <goals> 14 <goal>repackage</goal> 15 </goals> 16 <configuration> 17 <classifier>exec</classifier> 18 </configuration> 19 </execution> 20 </executions> 21 ... 22 </plugin> 23 ... 24 </plugins> 25 ... 26 </build> 27 ... 28 </project>
五、打包時排除resources下的資源文件

1 <build> 2 ... 3 <resources> 4 <resource> 5 <directory>src/main/resources</directory> 6 <excludes> 7 <exclude>**/*.properties</exclude> 8 <exclude>**/*.xml</exclude> 9 <exclude>**/*.yml</exclude> 10 </excludes> 11 </resource> 12 </resources> 13 <plugins> 14 ... 15 <plugin> 16 <groupId>org.springframework.boot</groupId> 17 <artifactId>spring-boot-maven-plugin</artifactId> 18 <executions> 19 <execution> 20 <goals> 21 <goal>repackage</goal> 22 </goals> 23 </execution> 24 </executions> 25 </plugin> 26 ... 27 </plugins> 28 ... 29 </build>
喜歡請微信掃描下面二維碼,關注我公眾號--“精修Java”,做一些實戰項目中的問題和解決方案分享。