1. 程式人生 > >是goal還是phase Maven外掛 plugin goal的執行與生命週期 lifecycle phase的關係

是goal還是phase Maven外掛 plugin goal的執行與生命週期 lifecycle phase的關係

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                這其實並不是一個複雜的問題,但是似乎沒有什麼資料對此做過清晰的說明,本文將對這個問題做一個詳細的解釋。

背景知識

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
           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述