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

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

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

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

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

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

當(dāng)我們?cè)谑褂迷摬寮臅r(shí)候,沒(méi)有定義phase的話,會(huì)自動(dòng)使用其插件定義的時(shí)候用的defaultPhase。比如我們使用的spring-boot-maven-plugin沒(méi)有配置phase,則默認(rèn)的phase是插件源碼RepackageMojo在@Mojo定義的參數(shù)defaultPhase,也就是package階段了。所以我們只要增加了goal的配置,即使沒(méi)有配置pahse,也可以在package階段直接打包了

二、SpringCloud下spring-boot-maven-plugin插件的打包的問(wèn)題
在SpringCloud項(xiàng)目中的spring-boot-maven-plugin配置如下:

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

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

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

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

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

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

