在maven中,實際上是有三套相互獨立的生命週期(Lifecycle),而不是咱們覺得的一套生命週期,準確地來講,在maven的世界,它有本身的一套生命週期管理的技術體系,在這套體系中,maven爲咱們定義了三套互相不影響的生命週期。它們分別是clean,default和site。 其中clean 和default最爲經常使用了。java
此外呢,每套生命週期 都有若干個生命週期階段(phase)。其中每套生命週期中的階段都依賴於前一個階段,以 clean 生命週期爲例。 clean 生命週期 它包含了 三個階段,pre-clean, clean, post-clean. Clean 依賴與pre-clean, post-clean依賴與clean,也就是說,當咱們執行clean 階段的時候, pre-clean 也會被執行。apache
下面會詳細介紹下三套生命週期服務器
clean 生命週期的目的是情理項目,它包含了三個階段:併發
pre-clean 執行一次清理前須要完成的工做maven
clean 執行清理工做post
post-clean 執行一些清理後要完成的工做測試
default 生命週期定義了真正構建時所須要執行的全部的步驟,它是全部生命週期中最核心的部分,它包括以下的階段ui
生命週期階段 | 描述 |
validate | 驗證項目是否正確,以及全部爲了完整構建必要的信息。 |
initialize | |
generate-sources | 生成全部須要包含在編譯過程當中的源代碼 |
process-sources | 處理源代碼 |
generate-resources | 生成所須要的包含在打包過程當中的資源文件 |
process-resources | 處理項目主資源文件。通常來講,是對src/main/resources目錄的內容進行變量替換等工做後,複製到項目輸出的主classpath目錄中 |
compile | 編譯項目的主源碼。通常來講,是編譯src/main/java目錄下的Java文件至項目輸出的主classpath目錄中 |
process-classes | 處理編譯生成的文件 如.class文件 |
generate-test-sources | 生成全部包含在測試編譯過程當中的測試源碼spa |
process-test-sources | 處理測試源碼插件 |
generate-test-resources | 生成廁所須要的資源文件 |
process-test-resources | 複製並處理測試次元文件到測試目標目錄 |
test-compile | 編譯測試代碼 |
process-test-classes | 處理 編譯測試文件 |
test | 執行測試 |
prepare-package | 在真正打包以前,執行一些準備打包的必要操做 |
package | 將編譯好的代碼打包成須要的格式 |
pre-integration-test | 執行一些在集成測試前的須要動做 |
integration-test | 處理包併發布到集成測試環境 |
post-integration-test | 執行一些在集成測試運行以後須要的動做 |
verify | 執行全部檢查,驗證包是否有效 |
install | 安裝包至本地倉庫 |
deploy | 複製包到遠程倉庫,共享給其餘開發人員和項目 |
Site 生命週期的目的是創建和發佈項目站點,Maven 可以基於 POM所包含的信息,自動生成一個友好的站點,方便團隊交流和發佈信息。它包含了以下4個階段
pre-site 執行項目生成前的工做
site 生成項目站點文檔
post-site 執行生成站點後的工做
site-deploy 將生成的項目站點發布到服務器上
從maven的命令行中,能夠看出 執行maven 任務最主要的方式 就是調用maven的生命週期階段。須要注意的是,這三套生命週期,是相互獨立的,只有在同一個生命週期裏面的階段 具備依賴關係。
以 mvn test 爲例,該命令調用defaul生命週期的test階段。實際執行的階段爲default生命週期的 validate,initialize等
直到test的全部階段。這也解釋了在執行測試的時候,項目源代碼也會獲得編譯。
Maven 定義了抽象的生命週期,具體的任務是由插件完成的,插件以獨立的構件形式存在,所以,Maven自己並不大,在實際應用中會下載不少插件。
插件自己而言,爲了可以複用代碼,每每可以完成多個任務。因此針對每一個任務單獨寫一個插件,顯得過於浪費,或者使得插件庫過於龐大,所以maven就將每一個功能設定成目標。
如 maven-dependency-plugin有十幾個目標,每一個目標對應一個功能。
mvn dependency:analyze mvn dependency:tree mvn dependency:list
Maven的生命週期與插件相互綁定,用以完成實際的構建任務。具體而言,生命週期的階段與插件的目標相互綁定,完成某個具體的構建任務。
Maven 默認給生命週期的各階段綁定了內置的一些插件目標,方便用戶。當經過maven命令執行生命週期的時候,會找到對應的綁定的插件目標,完成相應的任務
生命週期階段 | 插件 |
pre-clean | maven-clean-plugin:clean |
clean | maven-clean-plugin:clean |
post-clean | maven-clean-plugin:clean |
process-resources | maven-resources-plugin:resources |
compile | maven-compiler-plugin:compile |
process-test-resources | maven-resources-plugin:testResources |
test-compile | maven-compiler-plugin:testCompile |
test | maven-surefire-plugin:test |
package | maven-jar-plugin:jar |
install | maven-deploy-plugin:install |
deploy | maven-deploy-plugin:deploy |
pre-site | maven-site-plugin:site |
site | maven-site-plugin:site |
post-site | maven-site-plugin:site |
site-deploy | maven-site-plugin:deploy |
除了內置綁定之外,用戶還可以選擇將某個插件目標綁定到生命週期的某個階段上
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.1></version> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </execution> </plugin> </plugins> </build>
插件不是固定執行,能夠經過傳遞一些參數,進一步調正任務執行
在命令行執行任務的時候能夠經過 -D參數 並伴隨一個鍵值對,來配置插件目標參數
mvn install -Dmaven.test.skip=true
並非全部插件的參數 都適合在命令行配置,MAVEN提供了在pom配置文件裏面配置全局的配置.
在pom裏面生命插件的時候 能夠在節點 <configuration>下面配置對應的參數
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.1</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> </build>
針對任務目標的配置也是能夠的
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.1></version> <execution> <id>attach-sources</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> <configuration> <tasks> <echo>I'm jar-no-fork</echo> </tasks> </configuration> </execution> </plugin> </plugins> </build>