如果未在maven pom.xml中定義包裝類型,則使用jar lifecyle。
幾乎正確,jar
不是一個生命週期,它是一個包裝。 Maven有三個build life cycles(乾淨,默認,網站)可以應用於任何包裝。
按照官方Maven model
packaging
該類型的僞像這個項目產生的,例如罐子戰爭耳朵POM。插件可以創建自己的包裝,因此可以創建自己的包裝類型,因此該列表不包含所有可能的類型。
默認值爲:jar
。
每Maven的包裝類型都有一個默認生命週期
它不是默認的生命週期,可以調用它的項目的默認生命週期。它在默認生命週期中有default bindings,也就是說,根據定義的packaging
類型,插件已默認附加到默認生命週期的階段。
Maven的core concepts之一是約定優於配置。其默認綁定強制執行此原則,已經爲特定包裝提供了某些插件的某些目標的執行。
例如,默認情況下它已經期望(在compile
相經由maven-compiler-plugin
及其compile
目標)進行編譯,測試(通過maven-surefire-plugin
及其test
目標期間test
相)和包(通過maven-jar-plugin
及其jar
目標在package
階段)應用默認(jar
)包裝時您的項目。
(注意模式:我提到了一個插件,一個目標,一個階段,即默認綁定)。
這就是爲什麼minimal pom已經可以做很多:再次,這是約定優於配置。
在定義包裝類型,我們可以說,是因爲如果pom.xml的插件部分被用默認的插件和目標爲包裝構建生命週期填充?
事實上,它將像使用默認配置一樣執行默認連接的插件和目標並分配給某些階段來填充構建plugins
部分。
另請注意,如果添加了相同插件和目標的進一步執行,它將在默認綁定指定的之後調用(之後)。如有需要,請參閱下面的內容。
如果我們定義的插件部分插件,例如說編譯器插件, 並給它配置,做這些配置覆蓋插件的默認配置?
您可以定義一個或多個目標的其他插件和executions
,附加到某個階段。每個execution
可以有一個自定義configuration
。然而,configuration
這不是任何execution
部內,但聲明爲通用/全局配置將被應用到有關插件的任何執行,因此也通過包裝綁定默認附着的那些。
來自官方的POM reference在configuration
元素
默認行爲是根據元素名稱的configuration
元素的內容合併。如果孩子的POM有一個特定的元素,該值就成爲有效值。如果孩子POM沒有元素,但是父母有,那麼父母的值就成爲有效值。
和涉及execution
部分的configuration
元素:
configuration
:同上,但限制所述配置的目標,這個具體名單,而不是插件下的所有目標。
這就是爲什麼你經常看到的maven-compiler-plugin
不同source
/target
配置,沒有任何execution
。它將應用於通過默認綁定已附加的compile
(源代碼編譯)和testCompile
(測試代碼編譯)目標的默認執行。
此外,你甚至可以覆蓋默認綁定,並通過對相同的插件,同樣的目標,相同的執行ID(最重要的一點)添加execution
從某個階段刪除它,然後將其連接到一個不同的階段或到一個不存在的階段(或空的階段)。因此,您將禁用默認的插件目標執行。您也可以使用這個技巧將您的插件目標執行添加爲同一階段的第一個執行:禁用默認執行,添加執行,然後重新定義默認執行(然後使用不同的id)。然後,Maven將遵循執行聲明的順序。
檢查this SO answer關於如何生成執行ID。這裏最重要的一點是,從official Maven documentation
每個魔力通過指定的POM包裝默認的生命週期映射綁定到構建生命週期將分配給它
什麼答案
default-goalName
的執行ID !非常感謝你,這真的幫了我很多! :) – GionJh我只有一個額外的疑問:假設我定義了另一個插件編譯器被調用綁定到編譯階段,首先執行什麼目標:默認編譯器插件的目標還是我的插件目標? – GionJh
@GionJh默認綁定總是先執行,如果你需要先執行你的目標,那麼你可以使用一個技巧:覆蓋默認執行ID,將其綁定到空白階段(因此禁用它),然後定義你的執行,然後重新 - 定義默認綁定執行。然後,執行聲明的順序將被maven使用。 –