一、maven生命周期
http://ifeve.com/introduction-to-the-lifecycle/
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
1.內置的三個生命周期
我這邊的簡單理解是:
首先一共有三個內置的生命周期,一個為clean,一個為default,一個為site。
There are three built-in build lifecycles: default, clean and site. The default lifecycle handles your project deployment, the clean lifecycle handles project cleaning, while the site lifecycle handles the creation of your project's site documentation.
2.生命周期的組成
一個生命周期包含了許多階段,比如compile階段,install階段等等。階段是有順序的,典型的如下:

3.goal是什么
在講階段之前,先說下goal。
goal可以簡單理解為一個功能,功能是由插件實現的。
牛逼的插件可以有很多個goal,當然,我們不鼓勵一個插件做了所有的事,畢竟unix哲學嘛。
比如compile插件,org.apache.maven.plugins:maven-compiler-plugin。
它既可以編譯main下面的代碼,也可以編譯test下面的代碼,這里就被分成了兩個goal:
compile和testCompile。
當然,也有個直觀介紹(idea中的maven視圖),看下圖:

4.階段的組成
每個階段由0到多個目標(goal)組成。
但是,goal可以選擇不綁定到階段,也可以綁定到多個階段。
所以執行整個生命周期的過程,就是按照順序,執行各個phase,具體到每個phase的時候,按順序執行綁定到該phase的goal。
以打jar包為例,默認maven已經幫我們在每個phase中綁定了goal,如下:

5.如果我們想在某個階段新增goal怎么辦呢?
可以像下面這樣,在<phase>元素中指定:

以上配置<phase>中配置了process-test-resources階段,該階段我們附加了一個goal,那就是time。
再看下面的配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1</version> <configuration> <attach>true</attach> </configuration> <executions> <execution> <phase>compile</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
以上配置在<phase>中指定了compile,即在compile階段附加一個goal,該goal為當前插件的jar。
二、default生命周期中打包時默認綁定的插件
https://maven.apache.org/ref/3.6.0/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging
專門對比了下jar包和war包,可以發現只有打包階段用的插件不一樣:

這個可以驗證,在idea中,一個默認的maven web工程,在maven視圖中,plugins中顯示的插件如下:

可以看到,剩下的幾個插件,正好是war包pom中默認綁定的那幾個插件。
