解決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)文章
Java數(shù)據(jù)結(jié)構(gòu)之鏈表相關(guān)知識總結(jié)
今天給大家?guī)黻P(guān)于Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識,文章圍繞Java鏈表展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06MyBatis將查詢出的兩列數(shù)據(jù)裝配成鍵值對的操作方法
這篇文章主要介紹了MyBatis將查詢出的兩列數(shù)據(jù)裝配成鍵值對的操作代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08如何基于springcloud模擬RPC調(diào)用(Feign)
這篇文章主要介紹了如何基于springcloud模擬RPC調(diào)用(Feign),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04SpringDataMongoDB多文檔事務(wù)的實現(xiàn)
mongodb4.0也出來一段時間了,這個版本最為大眾期待的特性就是支持了多文檔事務(wù)。這篇文章主要介紹了SpringDataMongoDB多文檔事務(wù)的實現(xiàn),感興趣的小伙伴們可以參考一下2018-11-11SpringBoot中使用spring-retry 解決失敗重試調(diào)用
本文主要介紹了SpringBoot中使用spring-retry 解決失敗重試調(diào)用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案
這篇文章主要介紹了Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01