讀古今文學網 > Maven實戰 > 7.4.2 自定義綁定 >

7.4.2 自定義綁定

除了內置綁定以外,用戶還能夠自己選擇將某個插件目標綁定到生命週期的某個階段上,這種自定義綁定方式能讓Maven項目在構建過程中執行更多更富特色的任務。

一個常見的例子是創建項目的源碼jar包,內置的插件綁定關係中並沒有涉及這一任務,因此需要用戶自行配置。maven-source-plugin可以幫助我們完成該任務,它的jar-no-fork目標能夠將項目的主代碼打包成jar文件,可以將其綁定到default生命週期的verify階段上,在執行完集成測試後和安裝構件之前創建源碼jar包。具體配置見代碼清單7-3。

代碼清單7-3 自定義綁定插件目標

在POM的build元素下的plugins子元素中聲明插件的使用,該例中用到的是maven-source-plugin,其groupId為org.apache.maven.plugins,這也是Maven官方插件的groupId,緊接著artifactId為maven-source-plugin,version為2.1.1。對於自定義綁定的插件,用戶總是應該聲明一個非快照版本,這樣可以避免由於插件版本變化造成的構建不穩定性。

上述配置中,除了基本的插件坐標聲明外,還有插件執行配置,executions下每個execution子元素可以用來配置執行一個任務。該例中配置了一個id為attach-sources的任務,通過phrase配置,將其綁定到verify生命週期階段上,再通過goals配置指定要執行的插件目標。至此,自定義插件綁定完成。運行mvn verify就能看到如下輸出:

我們可以看到,當執行verify生命週期階段的時候,maven-source-plugin:jar-no-fork會得以執行,它會創建一個以-sources.jar結尾的源碼文件包。

有時候,即使不通過phase元素配置生命週期階段,插件目標也能夠綁定到生命週期中去。例如,可以嘗試刪除上述配置中的phase一行,再次執行mvn verify,仍然可以看到maven-source-plugin:jar-no-fork得以執行。出現這種現象的原因是:有很多插件的目標在編寫時已經定義了默認綁定階段。可以使用maven-help-plugin查看插件詳細信息,瞭解插件目標的默認綁定階段。運行命令如下:

該命令輸出對應插件的詳細信息。在輸出信息中,能夠看到關於目標jar-no-fork的如下信息:

該輸出包含了一段關於jar-no-fork目標的描述,這裡關心的是Bound to phase這一項,它表示該目標默認綁定的生命週期階段(這裡是package)。也就是說,當用戶配置使用maven-source-plugin的jar-no-fork目標的時候,如果不指定phase參數,該目標就會被綁定到package階段。

我們知道,當插件目標被綁定到不同的生命週期階段的時候,其執行順序會由生命週期階段的先後順序決定。如果多個目標被綁定到同一個階段,它們的執行順序會是怎樣?答案很簡單,當多個插件目標綁定到同一個階段的時候,這些插件聲明的先後順序決定了目標的執行順序。