Maven插件(plugin)goal的執行與生命週期(lifecycle)phase的關係

這其實並非一個複雜的問題,可是彷佛沒有什麼資料對此作過清晰的說明,本文將對這個問題作一個詳細的解釋。

背景知識

maven對構建(build)的過程進行了抽象和定義,這個過程被稱爲構建的生命週期(lifecycle)。生命週期(lifecycle)由多個階段(phase)組成,每一個階段(phase)會掛接一到多個goal。goal是maven裏定義任務的最小單元,至關於ant裏的target。

以phase爲目標構建

以phase爲目標進行構建是最多見的,如咱們平時常常執行的mvn compile,mvn test,mvn package...等等,compile,test,package都是maven生命週期(lifecycle)裏的phase,經過mvn命令,你能夠指定一次構建執行到那一個階段,在執行過程當中,全部經歷的執行階段(phase)上綁定的goal都將獲得執行。例如,對於一個jar包應用,當執行mvn package命令時,maven從validate階段一個階段一個階段的執行,在執行到compile階段時,compiler插件的compile goal會被執行,由於這個goal是綁定在compile階段(phase)上的。這一點可從其對應的mojo類上得知:

再好比常常使用的打包插件shade,它的goal是綁定到package階段的,這樣,使用mvn package進行打包時都會執行shade的。


以goal爲目標構建

雖然以phase爲目標的構建最多見,可是有時候咱們會發現, 一些插件的goal並不適合綁定到任何階段(phase)上,或者是,這些goal每每是單獨執行,不須要同某個階段(phase)綁定在一塊兒 ,好比hibernate插件的導入\導出goal多數狀況下是根據須要要手動執行的(固然,也能夠綁定到某個階段上,好比進行單元測試時,可考慮將其綁定到test階段上)。再好比jetty(6.1.26)插件,它的goal都是將打包或未打包的工程部署到jetty裏而後啓動jetty容器的,多數狀況下,人們都是獨立運行這些goal的,好比:人們但願當鍵入mvn jetty:run後,工程就能完成編譯後啓動jetty,而jetty插件也確實是這樣作的,它的run goal的mojo是這樣聲明的:

其中@execute phase="test-compile"指明jetty:run這一goal會促使maven先build到test-compile階段,再執行這個goal.一樣,對於jetty:run-war這個goal則要求先build到package階段再執行該goal.

而另一個例子是exec插件的exec:java.

這個goal也聲明瞭execute的phase,但倒是validate,這樣,若是代碼沒有編譯,執行這個goal就會出錯,因此多數狀況下,人們老是使用下面的方式執行的:
mvn clean compile exec:java
相關文章
相關標籤/搜索