解決SpringCloud下spring-boot-maven-plugin插件的打包問題
一、Maven生命周期、階段、目標(biāo)
之前一直對Maven的3套生命周期有點不清楚,記錄下自己的理解。
生命周期,就是一個事物從初始到消亡、開始到結(jié)束的過程,而Maven的生命周期就是指Maven官方對項目執(zhí)行Maven構(gòu)建從開始使用到使用結(jié)束整個流程的定義。
而所說的Mavn有3套生命周期,就是指Maven從開始使用到使用結(jié)束要經(jīng)過3個生命周期的流程,這3個生命周期各自獨立的,依次經(jīng)過的生命周期分別是 clean、default、site,每個生命周期流程中也包含了不同的 phase(或者稱作階段),這些階段也是有先后順序的??梢哉f3套生命周期就是對這些階段做的一個邏輯上劃分、分類。
- clean生命周期:因為項目如果是已經(jīng)有部署過的話,我們肯定是要先把已經(jīng)編譯生成好的文件,要先清除掉。
- default生命周期:然后執(zhí)行一些測試、編譯等步驟,default才是我們的重點,也是包含了最多的階段。
- site生命周期:最終發(fā)布到服務(wù)器上。
這樣最終就形成了3套生命周期。當(dāng)然以上的生命周期、階段其實都是Maven官方自己所定義的一些邏輯上Maven項目應(yīng)該經(jīng)過的流程,并不一定每個項目都會經(jīng)過這些所有的流程。而且用戶可以通過自定義插件的方式,來將插件綁定到各個階段,當(dāng)我們在Maven執(zhí)行命令的時候,就會執(zhí)行自定義的特殊業(yè)務(wù)。
比如對于spring-boot-maven-plugin,這個插件,我們使用這個插件的時候可以自定義該插件的phase為pre-clean。

mvn執(zhí)行階段的命令格式是:mvn 階段1 [階段2] [階段n]。那么當(dāng)執(zhí)行mvn pre-clean命令,就會執(zhí)行pre-clean階段的流程,該流程在maven官方應(yīng)該是沒有執(zhí)行任務(wù)邏輯的。我們可以對比下對一個項目執(zhí)行pre-clean和clean的差別:只有clean的時候才多了實執(zhí)行的delete的操作。

但是我們設(shè)置了這個<phase>pre-clean</phase>綁定后,我們執(zhí)行pre-clean命令,自然就會執(zhí)行到spring-boot-maven-plugin這個插件的邏輯。這里只是為了演示有綁定了pre-clean階段的動作,實際項目上是不應(yīng)該綁定到pre-clean階段上的。

并且在一個階段上也可以指定不同的goal/目標(biāo)(可以稱之為這個插件所提供的功能),一個插件可以提供多種不同的goal/目標(biāo)/功能,在IDEA的Maven控制面板上打開該pom項目,可以看到這個spring-boot插件就是包含了這些目標(biāo):build-info、help、repackage、run、start、stop。

而我們上面配置了<goal>repackage</goal>,意味著在執(zhí)行pre-clean階段的時候,會實際執(zhí)行到該插件的repackage這個目標(biāo)??梢钥吹綀?zhí)行mvn pre-clean的結(jié)果,這個就是執(zhí)行了repackage目標(biāo)。在執(zhí)行mvn命令可以指定要執(zhí)行的目標(biāo),所以上面相當(dāng)于執(zhí)行了:mvn pre-clean:repackage

在clean這個生命周期中,Maven總共定義了三個階段,分別是:pre-clean、clean、post-clean,各個階段有先后順序,執(zhí)行某個階段的時候會有序執(zhí)行其前面的所有階段。比如執(zhí)行mvn post-clean,則依次執(zhí)行pre-clean、clean、post-clean??梢钥吹疆?dāng)我們執(zhí)行mvn post-clean的時候,也會出現(xiàn)了上面那樣pre-clean時的錯誤

當(dāng)我們在使用該插件的時候,沒有定義phase的話,會自動使用其插件定義的時候用的defaultPhase。比如我們使用的spring-boot-maven-plugin沒有配置phase,則默認的phase是插件源碼RepackageMojo在@Mojo定義的參數(shù)defaultPhase,也就是package階段了。所以我們只要增加了goal的配置,即使沒有配置pahse,也可以在package階段直接打包了

二、SpringCloud下spring-boot-maven-plugin插件的打包的問題
在SpringCloud項目中的spring-boot-maven-plugin配置如下:

當(dāng)我們直接在SpringCloud項目下,對各個微服務(wù)子項目直接用命令mvn clean package打包會發(fā)現(xiàn)最終打出來的jar包并非可執(zhí)行jar包,而只是我們項目源文件的普通jar包。

正確的打包命令應(yīng)該是mvn clean package spring-boot:repackage,打包結(jié)果如下圖。其中.original結(jié)尾的文件,就是項目源代碼最初的jar包,然后springboot打包插件再根據(jù)該jar包再生成最終的可執(zhí)行jar包。

三、SpringCloud正確的打包方式
為什么SpringCloud工程打可執(zhí)行jar的命令是:mvn clean package spring-boot:repackage,而那些繼承了spring-boot-starter-parent的項目可以直接通過mvn clean package就可以打可執(zhí)行jar包?
這是因為在spring-boot-starter-parent的項目里已經(jīng)幫我們將打包插件綁定到了repackage的目標(biāo),而該插件如上文所提到的,已經(jīng)默認綁定到了package的階段,所以當(dāng)我們在SpringBoot項目執(zhí)行mvn clean package的時候其實就自動執(zhí)行了打普通jar包、并且通過repackage最終打成可執(zhí)行jar包的流程。

所以如果我們的SpringCloud想要也能夠像SpringBoot那樣執(zhí)行打包命令的話,可以在SpringCloud的父pom工程也定義好plugin的repackage目標(biāo):

這樣在子工程執(zhí)行package后,就可以發(fā)現(xiàn)已經(jīng)可以自動執(zhí)行打普通jar包的目標(biāo)了,接著繼續(xù)執(zhí)行repackage目標(biāo),最終就是我們所要的可執(zhí)行jar包。

如果只是單獨執(zhí)行mvn spring-boot:repackage,會報錯:Source file must be provided。需要先package 與 spring-boot:repackage 在同一條命令執(zhí)行才正確,可能插件內(nèi)部是在通過本次命令執(zhí)行中,根據(jù)package打出來的普通jar包的基礎(chǔ)上進行repackage的,不會去獲取倉庫中已有的普通jar包。
到此這篇關(guān)于SpringCloud下spring-boot-maven-plugin插件的打包問題的文章就介紹到這了,更多相關(guān)spring-boot-maven-plugin插件打包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring使用RestTemplate和Junit單元測試的注意事項
這篇文章主要介紹了Spring使用RestTemplate和Junit單元測試的注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
深入理解Java運行時數(shù)據(jù)區(qū)_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java運行時數(shù)據(jù)區(qū)的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-06-06
SpringBoot如何通過@Profile注解配置多環(huán)境
在Spring中,可以使用配置文件的方式來指定不同環(huán)境下所需要的配置信息,本文給大家介紹SpringBoot如何通過@Profile注解配置多環(huán)境,感興趣的朋友跟隨小編一起看看吧2023-06-06
java 在file的尾部添加數(shù)據(jù)的兩種方法總結(jié)
這篇文章主要介紹了java 在file的尾部添加數(shù)據(jù)的兩種方法總結(jié)的相關(guān)資料,這里提供了兩種在file尾部添加數(shù)據(jù)的方法,希望能幫助到大家,需要的朋友可以參考下2017-09-09
Kotlin基礎(chǔ)教程之Run,標(biāo)簽Label,函數(shù)Function-Type
這篇文章主要介紹了Kotlin基礎(chǔ)教程之Run,標(biāo)簽Label,函數(shù)Function-Type的相關(guān)資料,需要的朋友可以參考下2017-05-05
SpringCloud-Nacos服務(wù)注冊與發(fā)現(xiàn)方式
這篇文章主要介紹了SpringCloud-Nacos服務(wù)注冊與發(fā)現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07

