您好,登錄后才能下訂單哦!
這篇文章主要介紹“SpringCloud下spring-boot-maven-plugin插件的打包問題怎么解決”,在日常操作中,相信很多人在SpringCloud下spring-boot-maven-plugin插件的打包問題怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SpringCloud下spring-boot-maven-plugin插件的打包問題怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
之前一直對Maven的3套生命周期有點不清楚,記錄下自己的理解。
生命周期,就是一個事物從初始到消亡、開始到結束的過程,而Maven的生命周期就是指Maven官方對項目執行Maven構建從開始使用到使用結束整個流程的定義。
而所說的Mavn有3套生命周期,就是指Maven從開始使用到使用結束要經過3個生命周期的流程,這3個生命周期各自獨立的,依次經過的生命周期分別是 clean、default、site,每個生命周期流程中也包含了不同的 phase(或者稱作階段),這些階段也是有先后順序的。可以說3套生命周期就是對這些階段做的一個邏輯上劃分、分類。
clean生命周期:因為項目如果是已經有部署過的話,我們肯定是要先把已經編譯生成好的文件,要先清除掉。
default生命周期:然后執行一些測試、編譯等步驟,default才是我們的重點,也是包含了最多的階段。
site生命周期:最終發布到服務器上。
這樣最終就形成了3套生命周期。當然以上的生命周期、階段其實都是Maven官方自己所定義的一些邏輯上Maven項目應該經過的流程,并不一定每個項目都會經過這些所有的流程。而且用戶可以通過自定義插件的方式,來將插件綁定到各個階段,當我們在Maven執行命令的時候,就會執行自定義的特殊業務。
比如對于spring-boot-maven-plugin,這個插件,我們使用這個插件的時候可以自定義該插件的phase為pre-clean。
mvn執行階段的命令格式是:mvn 階段1 [階段2] [階段n]。那么當執行mvn pre-clean命令,就會執行pre-clean階段的流程,該流程在maven官方應該是沒有執行任務邏輯的。我們可以對比下對一個項目執行pre-clean和clean的差別:只有clean的時候才多了實執行的delete的操作。
但是我們設置了這個<phase>pre-clean</phase>綁定后,我們執行pre-clean命令,自然就會執行到spring-boot-maven-plugin這個插件的邏輯。這里只是為了演示有綁定了pre-clean階段的動作,實際項目上是不應該綁定到pre-clean階段上的。
并且在一個階段上也可以指定不同的goal/目標(可以稱之為這個插件所提供的功能),一個插件可以提供多種不同的goal/目標/功能,在IDEA的Maven控制面板上打開該pom項目,可以看到這個spring-boot插件就是包含了這些目標:build-info、help、repackage、run、start、stop。
而我們上面配置了<goal>repackage</goal>,意味著在執行pre-clean階段的時候,會實際執行到該插件的repackage這個目標。可以看到執行mvn pre-clean的結果,這個就是執行了repackage目標。在執行mvn命令可以指定要執行的目標,所以上面相當于執行了:mvn pre-clean:repackage
在clean這個生命周期中,Maven總共定義了三個階段,分別是:pre-clean、clean、post-clean,各個階段有先后順序,執行某個階段的時候會有序執行其前面的所有階段。比如執行mvn post-clean,則依次執行pre-clean、clean、post-clean。可以看到當我們執行mvn post-clean的時候,也會出現了上面那樣pre-clean時的錯誤
當我們在使用該插件的時候,沒有定義phase的話,會自動使用其插件定義的時候用的defaultPhase。比如我們使用的spring-boot-maven-plugin沒有配置phase,則默認的phase是插件源碼RepackageMojo在@Mojo定義的參數defaultPhase,也就是package階段了。所以我們只要增加了goal的配置,即使沒有配置pahse,也可以在package階段直接打包了
在SpringCloud項目中的spring-boot-maven-plugin配置如下:
當我們直接在SpringCloud項目下,對各個微服務子項目直接用命令mvn clean package打包會發現最終打出來的jar包并非可執行jar包,而只是我們項目源文件的普通jar包。
正確的打包命令應該是mvn clean package spring-boot:repackage,打包結果如下圖。其中.original結尾的文件,就是項目源代碼最初的jar包,然后springboot打包插件再根據該jar包再生成最終的可執行jar包。
為什么SpringCloud工程打可執行jar的命令是:mvn clean package spring-boot:repackage,而那些繼承了spring-boot-starter-parent的項目可以直接通過mvn clean package就可以打可執行jar包?
這是因為在spring-boot-starter-parent的項目里已經幫我們將打包插件綁定到了repackage的目標,而該插件如上文所提到的,已經默認綁定到了package的階段,所以當我們在SpringBoot項目執行mvn clean package的時候其實就自動執行了打普通jar包、并且通過repackage最終打成可執行jar包的流程。
所以如果我們的SpringCloud想要也能夠像SpringBoot那樣執行打包命令的話,可以在SpringCloud的父pom工程也定義好plugin的repackage目標:
這樣在子工程執行package后,就可以發現已經可以自動執行打普通jar包的目標了,接著繼續執行repackage目標,最終就是我們所要的可執行jar包。
如果只是單獨執行mvn spring-boot:repackage,會報錯:Source file must be provided。需要先package 與 spring-boot:repackage 在同一條命令執行才正確,可能插件內部是在通過本次命令執行中,根據package打出來的普通jar包的基礎上進行repackage的,不會去獲取倉庫中已有的普通jar包。
到此,關于“SpringCloud下spring-boot-maven-plugin插件的打包問題怎么解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。