2013-04-25 201 views
191

Maven目標和階段之間有什麼區別/關係?他們如何相互關聯?什麼是Maven的目標和階段,它們有什麼不同?

+3

問和[回答](http://stackoverflow.com/a/30953905/1744774)在[Maven:生命週期與階段與插件與目標](http://stackoverflow.com/questions/26607834/maven-lifecycle-vs-phase-vs-plugin-vs-goal/)(再一次)。 – 2015-06-20 13:07:38

+1

[Maven:Lifecycle vs. Phase vs. Plugin vs. Goal]的可能重複(https:// stackoverflow。com/questions/26607834/maven-lifecycle-vs-phase-vs-plugin-vs-goal) – 2017-08-18 18:06:39

回答

155

目標分階段執行,有助於確定訂單目標的執行。對此的最佳理解是查看default Maven lifecycle bindings,其中顯示哪些目標默認在哪些階段運行。編譯階段目標將始終在測試階段目標之前執行,而測試階段目標將始終在軟件包階段目標等之前執行。混亂的

一部分的事實,當你執行的行家,你可以指定一個目標或階段加劇。如果你指定了一個階段,那麼maven將運行所有階段直到你按順序指定的階段(例如,如果你指定了包,它將首先運行整個編譯階段,然後是測試階段,最後是包階段),對於每個階段它都會運行與該階段相關的所有目標。

當你創建你的Maven構建文件中的插件運行您只需要指定目標,然後將這一目標結合給定的默認階段。例如,jaxb:xjc目標默認綁定到生成資源階段。但是,當您指定執行時,您也可以明確指定該目標的階段。

如果指定當您執行的Maven然後將仍然運行各個階段達到了這一目標的階段目標。換句話說,如果您指定了jar目標,它將運行包階段(以及這些階段中的所有目標)的所有階段,然後它將運行jar目標。

+3

我已經習慣於說「Maven **通過**所有階段(直到幷包括給定的)」而不是_「運行」_或_「執行」_(後者在Maven的_構建生命週期介紹中被調用)。這樣就更加清楚了它實際執行的目標代碼。但這可能是個人的品味。 – 2015-06-20 13:25:57

+0

但是我們也可以運行不屬於任何階段的目標,即'mvn archetype:generate',在這種情況下,maven只執行目標? – 2017-06-03 21:27:46

+0

檢查最後一段。不,它不僅執行目標。 – Pace 2017-06-04 16:51:11

1

Maven工作術語有階段和目標。

階段:Maven的階段是一組動作,其與2個或3個進球

〔實施例相關: - 如果你運行mvn乾淨

這是階段將執行目標MVN清潔:清潔

目標:Maven的目標與約束相

參考 http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html

+4

它不一定是_「與2或3個目標相關」。它可以是_none_,_one_或_more_以及。 – 2015-06-20 13:29:25

24

個的定義在Maven site's page Introduction to the Build Lifecycle詳細,但我試圖summarize

Maven的定義4項的構建過程:

  1. 生命週期

    三內置生命週期(又名構建生命週期):default,clean,site。 (Lifecycle Reference

  2. 每個生命週期是由,例如對於default生命週期:compile,test,package,install

  3. 插件

    提供一個或多個目標的神器。

    根據包裝類型(jar,war等),插件的目標默認綁定到階段。被執行(Built-in Lifecycle Bindings

  4. 目標

    任務(動作)。一個插件可以有一個或多個目標。

    configuring a plugin in a POM需要指定一個或多個目標。此外,如果插件沒有定義默認階段,則指定的目標可以綁定到階段。

Maven可以與被調用:

  1. 一個相(例如cleanpackage
  2. <plugin-prefix>:<goal>(例如dependency:copy-dependencies
  3. <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>(例如org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile

與一個或多個組合任何或全部,例如:

mvn clean dependency:copy-dependencies package 
+0

只有_lifecycle階段_真的很有意義,被視爲構建過程的_「步驟」_ 。我寧願將它稱爲_4實體/物品/東西_。 – 2015-06-20 13:38:52

+0

當我看到世界「構建階段」時,我認爲它是生命週期中的另一個階段,它讓我感到困惑。 – 2017-06-03 21:36:48

31

選擇的答案是偉大的,但我仍然想添加一些小的話題。一個例證。

它清楚地展示了不同階段綁定到不同的插件以及這些插件所暴露的目標。

那麼,讓我們來看看運行像mvn compile的情況:

  • 這是一個階段其執行編譯插件與 編譯目標
  • Compiler插件有不同的目標。對於mvn compile它被映射到一個特定的目標,即編譯目標。
  • 這與運行mvn compiler:compile

因此,階段是由插件的目標

enter image description here

鏈接到reference

+15

爲什麼'mvn test'指向'package','mvn install'指向'deploy'? – Abdull 2015-10-11 11:11:03

+2

看起來像一個插圖錯誤,感謝您的注意(創建它在網絡上)。 – Stas 2015-10-11 11:22:01

+3

你從哪裏得到插圖?你有沒有檢查版權和使用條款? – Abdull 2015-10-11 11:24:14

113

生命週期是一個名爲階段的序列。
階段順序執行。執行階段意味着執行所有先前的階段。

插件是目標也稱爲MOJO集合(中號 Aven的ö LD Ĵ AVA ö bject)。類比:插件是一個類,目標是類中的方法。

Maven的是圍繞構建生命週期的核心概念。
有三個內置構建生命週期:

  1. 默認
  2. 乾淨
  3. 網站

Each Build Lifecycle is Made Up of Phases

例如,default生命週期包括以下構建階段的:

◾validate - validate the project is correct and all necessary information is available 
◾compile - compile the source code of the project 
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed 
◾package - take the compiled code and package it in its distributable format, such as a JAR. 
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run 
◾verify - run any checks to verify the package is valid and meets quality criteria 
◾install - install the package into the local repository, for use as a dependency in other projects locally 
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects. 

所以要經過上述階段,我們只需要調用一個命令:

mvn <phase> { Ex: mvn install } 

對於上面的命令,從第一階段開始,所有的階段順序執行,直到「安裝'階段。 mvn可以執行一個目標或階段(甚至多個目標或多個階段)如下:

mvn clean install plugin:goal 

但是,如果你想定製用於引用您的插件前綴,你可以直接通過指定前綴在plugin's POM.

A建築階段的maven-plugin-plugin配置參數由Plugin目標

大多數Maven的功能是在插件最多。一個插件提供了一組目標,可以使用以下語法執行:

mvn [plugin-name]:[goal-name] 

例如,Java項目可以與編譯器插件的編譯目標運行mvn compiler:compile編譯。

構建生命週期是一個命名階段列表,可用於命令執行目標。

插件提供的目標可以與生命週期的不同階段相關聯。例如,默認情況下,目標compiler:compilecompile相關聯,而目標surefire:testtest相關聯。考慮下面的命令:

mvn test 

當執行上述命令時,Maven運行與每個相直到幷包括所述相test的相關聯的所有目標。在這種情況下,Maven運行與process-resources階段相關的resources:resources目標,然後運行compiler:compile,依此類推,直到它終於運行surefire:test目標。

但是,即使構建階段負責構建生命週期中的特定步驟,但它履行這些責任的方式可能會有所不同。這是通過聲明插件目標綁定到這些構建階段來完成的。

插件目標代表了一個特定的任務(比構建階段更精細),有助於項目的構建和管理。它可能會被綁定到零或更多的構建階段。不受任何構建階段限制的目標可以通過直接調用在構建生命週期之外執行。執行順序取決於調用目標和構建階段的順序。例如,請考慮下面的命令。 cleanpackage參數是構建階段,而dependency:copy-dependencies是目標(的插件)。

mvn clean dependency:copy-dependencies package 

如果這是要執行的clean階段將首先執行(這意味着它將運行clean生命週期的所有前面的階段,再加上clean階段本身),然後dependency:copy-dependencies目標,最後才執行package階段(以及默認生命週期的所有前面的構建階段)。此外,如果一個目標必須與一個或多個構建階段綁定,那麼這個目標將在所有這些階段中被調用。

此外,構建階段也可以有零個或多個目標綁定到它。如果構建階段沒有綁定的目標,那麼構建階段將不會執行。但是,如果它有一個或多個目標綁定到它,它將執行所有這些目標。

Built-in Lifecycle Bindings
某些階段有默認綁定到他們的目標。而對於默認生命週期,這些綁定取決於包裝值。

Maven的架構:

enter image description here

Reference 1
Reference 2

+0

優秀的解釋! – 2016-10-03 09:31:47

+0

如果我有2個配置文件,我可以先運行配置文件1的所有插件,然後再運行配置文件2的插件嗎? – Bee 2016-12-19 12:07:44

+0

簡單解釋.. – 2017-05-31 15:17:45

5

感謝桑迪普金達萊和Premraj。他們的解釋有助於我在困惑了一段時間之後才明白。

我創建了一些完整的代碼示例&這裏有一些簡單的解釋https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/。我認爲這可能有助於他人理解。

在從鏈接短,你不應該試着去了解所有三個同時,首先應該瞭解這些羣體的關係:VS階段

  • 生命週期
  • 插件VS目標

1.生命週期VS階段

生命週期階段的集合,順序請參閱Life Cycle References。當您撥打階段時,它還會在之前呼叫所有階段

例如,具有3個階段的清潔生命週期(預清潔,清潔,後清潔)。

mvn clean 

它將調用預清潔乾淨

2.插件VS目標

目標就像插件的動作。所以如果插件是一個類,目標就是一種方法。

你可以調用這樣一個目標:

mvn clean:clean 

這意味着「調用乾淨的目標,在清理插件」(沒有涉及到清理階段在這裏,不要讓「清潔」字樣迷惑你,他們是不一樣的)

3.現在階段&目標之間的關係:

階段可以(預)鏈接目標(s)。例如,通常,清潔階段鏈接到乾淨的目標。所以,當你調用這個命令:

mvn clean 

它將調用預先清理階段和清理階段,其鏈接到清潔:清潔的目標。

這幾乎是一樣的:

mvn pre-clean clean:clean 

的更多細節和充分的例子是https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/

相關問題