讀古今文學網 > Maven實戰 > 17.3 Mojo標注 >

17.3 Mojo標注

每個Mojo都必須使用@Goal標注來註明其目標名稱,否則Maven將無法識別該目標。Mojo的標注不僅限於@Goal,以下是一些可以用來控制Mojo行為的標注。

·@goal<name>

這是唯一必須聲明的標注,當用戶使用命令行調用插件,或者在POM中配置插件的時候,都需要使用該目標名稱。

·@phase<phase>

默認將該目標綁定至Default生命週期的某個階段,這樣在配置使用該插件目標的時候就不需要聲明phase。例如,maven-surefire-plugin的test目標就帶有@phase test標注。

·@requiresDependencyResolution<scope>

表示在運行該Mojo之前必須解析所有指定範圍的依賴。例如,maven-surefire-plugin的test目標帶有@requiresDependencyResolution test標注,表示在執行測試之前,所有測試範圍的依賴必須得到解析。這裡可用的依賴範圍有compile、test和runtime,默認值為runtime。

·@requiresProject<true/false>

表示該目標是否必須在一個Maven項目中運行,默認為true。大部分插件目標都需要依賴一個項目才能執行,但有一些例外。例如maven-help-plugin的system目標,它用來顯示系統屬性和環境變量信息,不需要實際項目,因此使用了@requiresProject false標注。另外,maven-archetype-plugin的generate目標也是一個很好的例子。

·@requiresDirectInvocation<true/false>

當值為true的時候,該目標就只能通過命令行直接調用,如果試圖在POM中將其綁定到生命週期階段,Maven就會報錯,默認值為false。如果你希望編寫的插件只能在命令行獨立運行,就應當使用該標注。

·@requiresOnline<true/false>

表示是否要求Maven必須是在線狀態,默認值是false。

·@requiresReport<true/false>

表示是否要求項目報告已經生成,默認值是false。

·@aggregator

當Mojo在多模塊項目上運行時,使用該標注表示該目標只會在頂層模塊運行。例如maven-javadoc-plugin的aggregator-jar使用了@aggregator標注,它不會為多模塊項目的每個模塊生成Javadoc,而是在頂層項目生成一個已經聚合的Javadoc文檔。

·@execute goal=「<goal>」

在運行該目標之前先讓Maven運行另外一個目標,如果是本插件的目標,則直接使用目標名稱,否則使用「prefix:goal」的形式,即註明目標前綴。例如,maven-pmd-plugin是一個使用PMD來分析項目源碼的工具,它包含pmd和check等目標,其中pmd用來生成報告,而check用來驗證報告。由於check是依賴於pmd生成的內容的,因此可以看到它使用了標注@execute goal=「pmd」。

·@execute phase=「<phase>」

在運行該目標之前讓Maven先運行一個並行的生命週期,到指定的階段為止。例如maven-dependency-plugin的analyze使用了標注@execute phase="test-compile",因此當用戶在命令行執行dependency:analyze的時候,Maven會首先執行default生命週期所有至test-compile的階段。

·@execute lifecycle=「<lifecycle>」phase=「<phase>」

在運行該目標之前讓Maven先運行一個自定義的生命週期,到指定的階段為止。例如maven-surefire-report-plugin這個用來生成測試報告的插件,它有一個report目標,標注了@execute phase="test"lifecycle="surefire",表示運行這個自定義的surefire聲明週期至test階段。自定義生命週期的配置文件位於src/main/resources/META-INF/maven/lifecycle.xml。內容如代碼清單17-5所示。

代碼清單17-5 maven-surefire-report-plugin的自定義生命週期