一、前言
除了座標、依賴以及倉庫之外,Maven另外兩個核心概念是生命週期和插件。
生命週期是抽象,插件是其具體實現。
二、生命週期
Maven的生命週期就是對所有的構建過程進行抽象和統一,包含了項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎所有構建步驟。
Maven的生命週期是抽象的,這意味着生命週期本身不做任何實際的工作,在Maven的設計中,實際的任務(如編譯源代碼)都交由插件來完成。這種思想與設計模式中的模板方法(TemplateMethod)非常相似。
每個構建步驟都可以綁定一個或者多個插件行爲,而且Maven爲大多數構建步驟編寫並綁定了默認插件。例如,針對編譯的插件有maven-compiler-plugin,針對測試的插件有maven-surefire-plugin等。
1.三套生命週期
maven有三套生命週期:clean、 default、site
三套生命週期相互獨立,每個生命週期包含一些階段(phase),這些階段是有順序的,並且後面的階段依賴於前面的階段,
1.1 clean
清理項目
它包含三個階段:
1)pre-clean執行一些清理前需要完成的工作。
2)clean清理上一次構建生成的文件。
3)post-clean執行一些清理後需要完成的工作。
1.2 default
定義了項目構建時所需要執行的所有步驟
這裏只列出比較重要的階段:
-
process-sources:處理項目主資源文件。
一般來說,是對src/main/resources目錄的內容進行變量替換等工作後,複製到項目輸出的主classpath目錄中。
-
compile:編譯項目的主源碼。
一般來說,是編譯src/main/java目錄下的Java文件至項目輸出的主classpath目錄中。
-
process-test-sources:處理項目測試資源文件。
一般來說,是對src/test/resources目錄的內容進行變量替換等工作後,複製到項目輸出的測試classpath目錄中。
-
test-compile:編譯項目的測試代碼。
一般來說,是編譯src/test/java目錄下的Java文件至項目輸出的測試classpath目錄中
-
test:使用單元測試框架運行測試,測試代碼不會被打包或部署。
-
package:接受編譯好的代碼,打包成可發佈的格式,如JAR。
-
install:將jar包安裝到Maven本地倉庫,供本地其他Maven項目使用。
-
deploy:將最終的包複製到遠程倉庫,供其他開發人員和Maven項目使用。
1.3 site
建立和發佈項目站點,Maven能夠基於POM所包含的信息,自動生成一個友好的站點,方便團隊交流和發佈項目信息。
該生命週期包含如下階段:
- pre-site:執行一些在生成項目站點之前需要完成的工作。
- site:生成項目站點文檔。
- post-site:執行一些在生成項目站點之後需要完成的工作。
- site-deploy:將生成的項目站點發布到服務器上。
2.常用命令行命令
- mvn clean install : 清理項目,然後安裝jar包到maven本地倉庫
- mvn test : 執行測試
- mvn clean deploy : 清理項目,然後發佈jar包到遠程倉庫
三、插件
1.插件目標
Maven的核心僅僅定義了抽象的生命週期,具體的任務是交由插件完成的,插件以獨立的構件形式存在。
一個插件可以完成多個任務,而這每一個任務就是一個插件目標。
例如,maven-dependency-plugin 有許多插件目標:dependency:analyze、dependency:tree 和 dependency:list。
冒號前面是插件前綴,冒號後面是插件目標。
2.插件綁定
Maven生命週期的階段與插件的目標相互綁定,以完成某個具體的構建任務。
2.1 內置綁定
爲了能讓用戶幾乎不用任何配置就能構建Maven項目,Maven在覈心爲一些主要的生命週期階段綁定了很多插件的目標,當用戶通過命令行調用生命週期階段的時候,對應的插件目標就會執行相應的任務。
2.2 自定義綁定
Maven支持將某個插件目標綁定到生命週期的某個階段上
3.插件配置
3.1 命令行參數
可通過命令行參數來配置插件,如:
mvn clean install -Dmaven.test.skip=true
參數-D是Java自帶的,其功能是通過命令行設置一個Java系統屬性
3.2 POM中插件全局配置
有些參數的值從項目創建到項目發佈都不會改變,或者說很少改變,對於這種情況,在POM文件中一次性配置就顯然比重複在命令行輸入要方便。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<extdirs>${project.basedir}/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
-
通過插件
<configuration>
節點可進行插件的全局配置。 -
全局配置的意思是在插件對應的生命週期的所有階段都採用此配置。
3.3 POM中插件任務配置
除了爲插件配置全局的參數,用戶還可以爲某個插件任務配置特定的參數。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>ant-validate</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuraction>
<tasks>
<echo>I'm bound to validate phase.</echo>
</tasks>
</configuraction>
</execution>
<execution>
<id>ant-verify</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuraction>
<tasks>
<echo>I'm bound to verify phase.</echo>
</tasks>
</configuraction>
</execution>
</executions>
</plugin>
</plugins>
</build>
- execution:執行任務
- id : 執行任務的id
- phase : 生命週期的特定階段
- goal :插件目標
- configuraction :插件任務的配置
在上述配置中,配置了兩個任務:ant-validate 和 ant-verify 。
ant-validate 將插件 maven-antrun-plugin 的 run 目標綁定到maven default生命週期的 validate階段上,同時配置了一個echo 任務,向命令行輸出一段文字。
4.獲取插件
當需要插件時,可以訪問如下網址獲取
5.插件解析機制
Maven會區別對待依賴的遠程倉庫與插件的遠程倉庫:
當Maven需要的依賴在本地倉庫不存在時,它會去所配置的遠程倉庫查找
可是當Maven需要的插件在本地倉庫不存在時,它就不會去這些遠程倉庫查找。
不同於repositories及其repository子元素,插件的遠程倉庫使用pluginRepositories和pluginRepository配置。
默認的中央插件倉庫:
文件路徑:apache-maven-3.5.4/lib/maven-model-builder-3.5.4.jar!/org/apache/maven/model/pom-4.0.0.xml
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
遠程插件倉庫的節點含義與遠程倉庫的節點含義相同。