[英]Maven default life-cycle and plugins section
如果我錯了,請糾正我。 如果在Maven pom.xml
未定義包裝類型,則默認使用jar
lifecyle。
每個Maven打包類型都有一個默認的構建生命周期和相關的默認目標。 (我們可以將目標視為插件+命令 )
生命周期階段目標
我的問題是 :
在定義包裝類型時,我們是否可以說好像pom.xml
插件部分填充了該包裝構建生命周期的默認插件和目標?
也:
如果我們在“插件”部分中定義插件,例如編譯器插件,並給出其配置,這些配置是否會覆蓋插件的默認配置?
如果未在Maven pom.xml中定義包裝類型,則使用jar lifecyle。
幾乎正確, jar
不是生命周期,而是包裝。 Maven具有三個 構建生命周期 (干凈,默認,現場),可以應用於任何包裝。
按照官方Maven模型
packaging
此項目生成的工件的類型,例如jar war ear pom。 插件可以創建自己的包裝,因此可以創建自己的包裝類型,因此此列表並不包含所有可能的類型。
默認值為 :jar
。
每個Maven打包類型都有默認的構建生命周期
它沒有默認的生命周期,您可以在其項目上調用默認的生命周期。 它具有默認生命周期的默認綁定 ,也就是說,默認情況下已根據定義的packaging
類型將插件附加到默認生命周期的各個階段。
Maven的核心概念之一是約定優於配置 。 它的默認綁定強制執行了這一原理,已經為給定的包裝提供了某些插件的某些目標的執行。
例如,默認情況下,已經希望進行編譯(通過maven-compiler-plugin
及其在compile
階段的compile
目標),測試(通過maven-surefire-plugin
及其在test
階段的test
目標)和打包(通過使用maven-jar-plugin
及其在package
階段的jar
目標)在應用默認( jar
)打包時的項目。
(請注意模式:我提到了一個插件,一個目標,一個階段,即默認綁定)。
這就是為什么最小pom已經可以做很多事情的原因:再次,這是對配置的約定。
在定義包裝類型時,我們是否可以說好像pom.xml插件部分填充了該包裝構建生命周期的默認插件和目標?
確實,這就像使用默認的附加插件和目標的執行填充構建plugins
部分,並使用其默認配置將其分配給某些階段。
另外還要注意,如果您添加了相同插件和目標的進一步執行,則它將在默認綁定指定的插件之上(之后)被調用。 必要時,請參見下文如何預防。
如果我們在“插件”部分中定義了一個插件,例如編譯器插件,並為其提供了配置,這些配置是否會覆蓋插件的默認配置?
您可以定義附加到某個階段的其他插件和它們的一個或多個目標的executions
。 每個execution
可以有一個自定義configuration
。 然而, configuration
這不是任何內execution
部,但聲明為通用/全局配置將被應用到所關注的插件的任何執行 ,因此也通過包裝綁定默認附着的那些。
來自configuration
元素的官方POM參考
默認行為是根據元素名稱合並
configuration
元素的內容。 如果子POM具有特定元素,則該值將成為有效值。 如果子POM沒有元素,但父POM沒有元素,則父值成為有效值。
關於execution
部分的configuration
元素:
configuration
:與上面相同,但將配置限制在此特定目標列表中,而不是插件下的所有目標中。
這就是為什么您經常看到maven-compiler-plugin
的不同source
/ target
配置,而沒有execution
任何內容的原因。 它將應用於已通過默認綁定附加的compile
(源代碼編譯)和testCompile
(測試代碼編譯)目標的默認執行。
此外,你甚至可以覆蓋默認綁定並通過添加從某個階段刪除它execution
了相同的插件,同樣的目標, 同樣執行ID(最重要的一點),並將其連接到一個不同的階段,或者一個不存在的相位(或為空)。 這樣,您將禁用默認插件目標執行。 您還可以使用該技巧將插件目標執行添加為同一階段的第一次執行:通過禁用默認執行,添加執行,然后重新定義默認執行(然后使用不同的ID)。 然后,Maven將遵循執行聲明的順序。
檢查有關如何生成執行ID的此答案 。 這里的重點是來自Maven官方文檔
通過指定POM包裝的默認生命周期映射綁定到構建生命周期的每個mojo都將為其分配一個
default-goalName
執行ID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.