早在Maven出現之前,項目構建的生命週期就已經存在了,軟件開發人員每天都對項目進行清理、編譯、測試和部署。通過Maven更加方便管理項目的各個生命週期。Maven本質是一個插件框架,本身並不執行任何構建任務,所有的工作都是交給插件來完成的。熟練使用Maven插件,可以讓我們的開發工作事半功倍
一、maven生命週期和插件關係
生命週期和插件是Maven的兩個核心概念,Maven的生命週期是抽象的,其實際行爲都由插件來完成。Maven的生命週期是爲了對所有的構建過程進行抽象和統一。Maven從大量的項目和構建工具中學習和反思,然後總結了一套高度完善、易拓展的生命週期。這個生命週期包括了清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎所有的構建步驟。
每個生命週期中都包含着一系列的階段(phase)。這些 phase 就相當於 Maven 提供的統一的接口,然後這些 phase 的實現由 Maven 的插件來完成。每個階段(phase)會掛接一到多個goal。goal是maven裏定義任務的最小單元。
lifecycle是總任務,phase就是總任務分出來的一個個子任務,但是這些子任務是被規格化的,它可以同時被多個lifecycle所包含,一個lifecycle可以包含任意個phase,phase的執行是按順序的,一個phase可以綁定很多個goal,至少爲一個,沒有goal的phase是沒有意義的
這是執行任務的最小單元,它可以綁定到任意個phase中,一個phase有一個或多個goal,goal也是按順序執行的,一個phase被執行時,綁定到phase裏的goal會按綁定的時間被順序執行,不管phase己經綁定了多少個goal,你自己定義的goal都可以繼續綁到phase中
我們在輸入 mvn 命令的時候 比如 mvn clean,clean 對應的就是 Clean 生命週期中的 clean 階段。但是 clean 的具體操作是 maven-clean-plugin 裏面的clean goal 被執行。
二、maven生命週期
Maven擁有三套相互獨立的生命週期,他們分別是clean,default 和site。clean生命週期的目的是清理項目,default生命週期的目的是構建項目,而site生命週期的目的是建立項目站點。
- clean生命週期
phase | 描述 |
pre-clean | 在實際項目清理之前執行所需的過程 |
clean | 刪除上一個版本生成的所有文件 |
post-clean | 執行完成項目清理所需的過程 |
- default生命週期的phase又可以分爲:
phase | 描述 |
validate | 驗證項目是否正確,並提供所有必要信息。 |
initialize | 初始化構建狀態,例如設置屬性或創建目錄。 |
compile | 編譯項目的源代 |
test | 使用合適的單元測試框架運行測試。這些測試不應要求打包或部署代碼。 |
package | 獲取已編譯的代碼並將其打包爲可分發的格式,例如JAR。 |
verify | 運行任何檢查以驗證包是否有效並符合質量標準。 |
install | 將軟件包安裝到本地存儲庫中,以便在本地用作其他項目的依賴項。 |
deploy | 在集成或發佈環境中完成,將最終包複製到遠程存儲庫以與其他開發人員和項目共享。 |
- site生命週期
phase | 描述 |
pre-site | 在實際項目站點生成之前執行所需的過程 |
site | 生成項目的站點文檔 |
post-site | 執行完成站點生成所需的流程,並準備站點部署 |
site-deploy | 將生成的站點文檔部署到指定的Web服務器 |
三、命令行與生命週期
從命令行執行maven任務的最主要方式就是調用maven的生命週期階段。需要注意的是,各個生命週期是相互獨立的,而一個生命週期的階段是有前後依賴關係的。例子如下:
1、$mvn clean :該命令調用clean生命週期的clean階段。實際執行的階段爲clean生命週期的pre-clean和clean階段。
2、$mvn test:該命令調用default生命週期的test階段。實際調用的是default生命週期的validate、initialize等,直到test的所有階段。
3、$mvn clean install:該命令調換用clean生命週期的clean階段和default生命週期的instal階段。
四、maven插件
clean插件maven-clean-plugin:2.5
clean階段是獨立的一個階段,功能就是清除工程目前下的target目錄,對應的插件是 maven-clean-plugin:2.5,2.5是版本號,可以使用maven內置的插件,當然也可以自己在pom中配置
resources插件maven-resources-plugin:2.6
resource插件的功能就是把項目需要的配置文件拷貝到指定的目當,默認是拷貝src\main\resources目錄下的件到classes目錄下,當然可以自己來配置源目錄和輸出目錄。resources插件一般不單獨執行,complie插件執行時會先調用resources插件。配置示例如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- 在default生命週期的 validate階段就執行resources插件的copy-resources目標 -->
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<!-- 指定resources插件處理資源文件到哪個目錄下 -->
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
<!-- 也可以用下面這樣的方式(指定相對url的方式指定outputDirectory) <outputDirectory>target/classes</outputDirectory> -->
<!-- 待處理的資源定義 -->
<resources>
<resource>
<!-- 指定resources插件處理哪個目錄下的資源文件 -->
<directory>src/main/${deploy.env}/applicationContext.xml</directory>
<!-- 指定不需要處理的資源 <excludes> <exclude>WEB-INF/*.*</exclude> </excludes> -->
<!-- 是否對待處理的資源開啓過濾模式 (resources插件的copy-resources目標也有資源過濾的功能,這裏配置的
這個功能的效果跟<build><resources><resource>下配置的資源過濾是一樣的,只不過可能執行的階段不一樣, 這裏執行的階段是插件指定的validate階段,<build><resources><resource>下的配置將是在resources插件的resources目標執行時起作用(在process-resources階段)) -->
<filtering>false</filtering>
</resource>
</resources>
</configuration>
<inherited></inherited>
</execution>
</executions>
</plugin>
compile插件maven-compiler-plugin
compile插件執行時先調用resouces插件,功能就是把src\mainjava源碼編譯成字節碼生成class文件,並把編譯好的class文件輸出到target\classes目錄下。下面看執行結果:
單元測試所用插件surefire-maven-plugin
單元測試所用的compile和resources插件和主代碼是相同的,但執行的目標不行,目標testCompile和testResources是把src\test\java下的代碼編譯成字節碼輸出到target\test-classes,同時把src\test\resources下的配置文件拷貝到target\test-classes。看下面的輸出:
插件maven-surefire-plugin:2.12.4是執行單元測試類的,如果單測試不通行,構建會失敗,在編譯正式的項目時可以使用mvn -Dmaven.test.skip=true 來跳過測試類的編譯和運行過程。mvn test可以單獨執行,但是這個命令其實是包括了resources、compile、testResources、testCompile、test這幾個階段如上面所說。
發佈插件maven-install-plugin
發佈插件的功能就是把構建好的artifact部署到本地倉庫,還有一個deploy插件是將構建好的artifact部署到遠程倉庫。