12.23 基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

Maven 構建生命週期定義了一個項目構建跟發佈的過程。

一、Maven構建生命週期

一個典型的 Maven 構建(build)生命週期是由以下幾個階段的序列組成的:

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

下面對上面幾個階段進行簡單介紹,另外還有一個標準的clean(項目清理)階段,未在上面羅列。

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

生命週期(lifecycle)可以理解成由各種plugin按照一定的順序執行來完成Java項目清理、編譯、打包、測試、部署等整個項目的流程的一個過程。

生命週期(lifecycle)由各個階段組成,每個階段由maven的插件plugin來執行完成。生命週期(lifecycle)主要包括clean、compile、package、install、testResources、testCompile等,其中帶test開頭的都是用於編譯測試代碼或運行單元測試用例的。



二、Maven構建項目示例

下面以一個實際的Spring Cloud Alibaba項目示例(來自小編的Spring Cloud技術專欄)。使用常用的mvn clean install 命令,演示整個構建過程。

以nacos-config-example 子項目示例,代碼如下所示,具體代碼細節可以訪問小編的Spring Cloud 技術專欄。

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

pom.xml 文件中添加了spring-boot-maven-plugin 插件:

<build>

<pluginmanagement>

<plugins>

<plugin>

<groupid>org.springframework.boot/<groupid>

<artifactid>spring-boot-maven-plugin/<artifactid>


在cmd窗口,到項目的根目錄,執行mvn clean install,看看輸出結果。

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

上述構建過程中,各個插件的執行順序為:1:clean、2:resources、3:compile、4:testResources、5:testCompile、6:test、7:jar、8:repackage、9:install。在圖中標記的地方每一行都是由冒號分隔的,前半部分是對應的插件,後半部分是插件的執行目標,也就是插件執行產生的結果。

上圖中,只有spring-boot-maven-plugin 插件是我們配置的,如下圖所示,那其他插件呢?

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

上圖中其他的插件沒有配置,但最後項目構建成功,說明maven內置的各種插件,如果pom中沒有配置就調用默認的內置插件,如果pom中配置了就調用配置的插件。

Maven構建過程就是由各種插件按照一定的順序執行來完成項目的編譯、單元測試、打包、佈署的完成。各種插件的執行過程也就構成了maven的生命週期(lifecycle)。生命週期(lifecycle)各個階段並不是獨立的,可以單獨執行如mvn clean,也可以一起執行如mvn clean install。而且有的mvn命令其是包括多個階段的,如mvn compile其實包括了resources和compile兩個階段。



三、理解maven構建階段

1. clean階段

clean階段是獨立的一個階段,功能就是清除工程目前下的target目錄,對應的插件是 maven-clean-plugin:3.1.0,3.1.0是版本號,使用maven內置的插件。

執行clean會清除工程中的target目錄:

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

2. resources階段

resources階段的插件maven-resources-plugin:3.1.0。resource插件的功能就是把項目需要的配置文件拷貝到指定的目錄,默認是拷貝src\\main\\resources目錄下的配置文件到classes目錄下,當然可以自己來配置源目錄和輸出目錄。resources插件一般不單獨執行,compile插件執行時會先調用resources插件。

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

3. compile階段

compile插件maven-compiler-plugin執行時先調用resouces插件,功能就是把src\\main\\java源碼編譯成字節碼生成class文件,並把編譯好的class文件輸出到target\\classes目錄下。

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

4. testResources和testCompile 階段

該階段所用的compile和resources插件和main主代碼是相同的,但執行的目標不同,testCompile和testResources是把src\\test\\java下的代碼編譯成字節碼輸出到target\\test-classes,同時把src\\test\\resources下的配置文件拷貝到target\\test-classes。

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

配置文件和單元測試類輸出到test-classes 目錄,如下所示:

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

5. test階段

插件maven-surefire-plugin:2.22.2是執行單元測試類的。如果單元測試不通行,構建會失敗,在編譯正式的項目時可以使用mvn compile -Dmaven.test.skip=true 來跳過測試類的編譯和運行過程。mvn test可以單獨執行,但是這個命令其實是包括了resources、compile、testResources、testCompile、test這幾個階段。

6. jar階段和repackage階段

maven-jar-plugin:3.1.2 這個插件是把class文件、配置文件打成一個jar(war或其它格式)包。依賴包是不在jar裡面的,需要建立lib目錄,且jar和lib目錄在同級目錄。

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

spring-boot-maven-plugin插件,在mvn package之後,再次打包可執行的jar/war,同時保留mvn package生成的jar/war為*.origin。

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

7. install階段

發佈插件maven-install-plugin的功能就是把構建好的artifact部署到本地倉庫,還有一個deploy插件是將構建好的artifact部署到遠程倉庫。

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

四、IDEA開發工具Maven工具欄

可以通過IDEA 開發工具右側的Maven工具欄方便看到maven插件列表,如下圖所示:

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

我們可以看到spring-boot-maven-plugin插件的5個goals:

  • spring-boot:repackage,默認goal。在mvn package之後,再次打包可執行的jar/war,同時保留mvn package生成的jar/war為*.origin。
  • spring-boot:run,運行Spring Boot應用。
  • spring-boot:start,在mvn integration-test階段,進行Spring Boot應用生命週期的管理。
  • spring-boot:stop,在mvn integration-test階段,進行Spring Boot應用生命週期的管理。
  • spring-boot:build-info,生成Actuator使用的構建信息文件build-info.properties。

spring-boot-maven-plugin最主要goal就是repackage,其在Maven的package生命週期階段,能夠將mvn package生成的jar包,再次打包為可執行的fat jar包,並將mvn package生成的jar包重命名為*.original。

基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程

可以看到生成的兩個jar文件,一個是*.jar,另一個是*.jar.original。


五、maven命令package、install、deploy比較

我們在用maven構建Java項目時,最常用的打包命令有mvn package、mvn install、mvn deploy,這三個命令都可完成打jar包或war的功能,但這三個命令還是有區別的。

  • package命令完成了項目編譯、單元測試、打包功能,將jar包放置在工程的target目錄中。
  • install命令完成了項目編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫,但沒有佈署到遠程maven私服倉庫。
  • deploy命令完成了項目編譯、單元測試、打包功能,同時把打好的可執行jar包(war包或其它形式的包)佈署到本地maven倉庫和遠程maven私服倉庫。
基於Spring Boot實際項目,詳解Maven構建生命週期和構建過程


分享到:


相關文章: