解決SpringCloud下spring-boot-maven-plugin插件的打包問題
一、Maven生命周期、階段、目標(biāo)
之前一直對(duì)Maven的3套生命周期有點(diǎn)不清楚,記錄下自己的理解。
生命周期,就是一個(gè)事物從初始到消亡、開始到結(jié)束的過程,而Maven的生命周期就是指Maven官方對(duì)項(xiàng)目執(zhí)行Maven構(gòu)建從開始使用到使用結(jié)束整個(gè)流程的定義。
而所說的Mavn有3套生命周期,就是指Maven從開始使用到使用結(jié)束要經(jīng)過3個(gè)生命周期的流程,這3個(gè)生命周期各自獨(dú)立的,依次經(jīng)過的生命周期分別是 clean、default、site,每個(gè)生命周期流程中也包含了不同的 phase(或者稱作階段),這些階段也是有先后順序的。可以說3套生命周期就是對(duì)這些階段做的一個(gè)邏輯上劃分、分類。
- clean生命周期:因?yàn)轫?xiàng)目如果是已經(jīng)有部署過的話,我們肯定是要先把已經(jīng)編譯生成好的文件,要先清除掉。
- default生命周期:然后執(zhí)行一些測(cè)試、編譯等步驟,default才是我們的重點(diǎn),也是包含了最多的階段。
- site生命周期:最終發(fā)布到服務(wù)器上。
這樣最終就形成了3套生命周期。當(dāng)然以上的生命周期、階段其實(shí)都是Maven官方自己所定義的一些邏輯上Maven項(xiàng)目應(yīng)該經(jīng)過的流程,并不一定每個(gè)項(xiàng)目都會(huì)經(jīng)過這些所有的流程。而且用戶可以通過自定義插件的方式,來將插件綁定到各個(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)該是沒有執(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控制面板上打開該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í)候,沒有定義phase的話,會(huì)自動(dòng)使用其插件定義的時(shí)候用的defaultPhase。比如我們使用的spring-boot-maven-plugin沒有配置phase,則默認(rèn)的phase是插件源碼RepackageMojo在@Mojo定義的參數(shù)defaultPhase,也就是package階段了。所以我們只要增加了goal的配置,即使沒有配置pahse,也可以在package階段直接打包了
二、SpringCloud下spring-boot-maven-plugin插件的打包的問題
在SpringCloud項(xiàng)目中的spring-boot-maven-plugin配置如下:
當(dāng)我們直接在SpringCloud項(xiàng)目下,對(duì)各個(gè)微服務(wù)子項(xiàng)目直接用命令mvn clean package打包會(huì)發(fā)現(xiàn)最終打出來的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)目可以直接通過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包、并且通過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)部是在通過本次命令執(zhí)行中,根據(jù)package打出來的普通jar包的基礎(chǔ)上進(jìn)行repackage的,不會(huì)去獲取倉(cāng)庫(kù)中已有的普通jar包。
到此這篇關(guān)于SpringCloud下spring-boot-maven-plugin插件的打包問題的文章就介紹到這了,更多相關(guān)spring-boot-maven-plugin插件打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)之鏈表相關(guān)知識(shí)總結(jié)
今天給大家?guī)黻P(guān)于Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),文章圍繞Java鏈表展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06MyBatis將查詢出的兩列數(shù)據(jù)裝配成鍵值對(duì)的操作方法
這篇文章主要介紹了MyBatis將查詢出的兩列數(shù)據(jù)裝配成鍵值對(duì)的操作代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08Java如何優(yōu)雅的實(shí)現(xiàn)微信登錄注冊(cè)
這篇文章主要給大家介紹了關(guān)于Java如何優(yōu)雅的實(shí)現(xiàn)微信登錄注冊(cè)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02如何基于springcloud模擬RPC調(diào)用(Feign)
這篇文章主要介紹了如何基于springcloud模擬RPC調(diào)用(Feign),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04SpringDataMongoDB多文檔事務(wù)的實(shí)現(xiàn)
mongodb4.0也出來一段時(shí)間了,這個(gè)版本最為大眾期待的特性就是支持了多文檔事務(wù)。這篇文章主要介紹了SpringDataMongoDB多文檔事務(wù)的實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2018-11-11Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(38)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07SpringBoot中使用spring-retry 解決失敗重試調(diào)用
本文主要介紹了SpringBoot中使用spring-retry 解決失敗重試調(diào)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案
這篇文章主要介紹了Spring?@Cacheable注解類內(nèi)部調(diào)用失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01