2016-04-12 31 views
2

如果我錯了,請糾正我。如果沒有在Maven pom.xml中定義包裝類型,則默認使用生命週期jarMaven默認生命週期和插件部分

每個Maven包裝類型都有默認的構建生命週期和關聯的默認目標。 (我們可以想目標插件+命令

生命週期階段目標

  • 過程中資源的資源:資源
  • 編譯編譯:編譯
  • 工藝 - 測試 - 資源資源:testResources
  • test-compile編譯器:testcompile
  • test surefire:test
  • jar包:罐子
  • 安裝安裝:安裝
  • 部署部署:部署

我的問題是
在定義包裝類型,我們可以說,這是因爲如果pom.xml插件部分填充了該包裝構建生命週期的默認插件和目標?

也:
如果我們定義的插件部分插件,例如說編譯器插件,並給予其配置,做這些配置覆蓋插件的默認配置?

回答

3

如果未在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 referenceconfiguration元素

默認行爲是根據元素名稱的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包裝默認的生命週期映射綁定到構建生命週期將分配給它

+1

什麼答案default-goalName的執行ID !非常感謝你,這真的幫了我很多! :) – GionJh

+0

我只有一個額外的疑問:假設我定義了另一個插件編譯器被調用綁定到編譯階段,首先執行什麼目標:默認編譯器插件的目標還是我的插件目標? – GionJh

+1

@GionJh默認綁定總是先執行,如果你需要先執行你的目標,那麼你可以使用一個技巧:覆蓋默認執行ID,將其綁定到空白階段(因此禁用它),然後定義你的執行,然後重新 - 定義默認綁定執行。然後,執行聲明的順序將被maven使用。 –

相關問題