maven的生命周期時抽象的,這意味著生命周期本身不做任何實際的工作,實際的任務(wù)都交由插件來完成。每個構(gòu)建步驟都可以綁定一個或多個插件行為,而且maven為都多數(shù)構(gòu)建步驟編寫并綁定了默認(rèn)插件。例如針對編譯的插件maven-compiler-plugin,針對測試的插件maven-surefire-plugin等。用戶也可配置插件定制構(gòu)建行為,甚至自己編寫插件。
插件目標(biāo)
插件以獨立的構(gòu)件形式存在,maven會在需要的時候下載并使用插件。
每個插件往往能完成多個任務(wù)。例如maven-dependency-plugin,它能分析依賴來源,列出依賴樹等,這些功能聚集在一個插件里,每個功能就是一個插件目標(biāo)。
maven-dependency-plugin有十多個模板,上述功能分別對應(yīng)插件目標(biāo)為dependency:list、dependency:tree。這是通用寫法,冒號前面是插件前綴,冒號后面是插件目標(biāo)。
插件綁定
maven生命周期的階段與插件的目標(biāo)相互綁定,以完成某個具體的構(gòu)件任務(wù)。
內(nèi)置綁定
maven為一些主要的生命周期階段綁定了很多插件的目標(biāo)。
| 生命周期階段 | 插件目標(biāo) |
|---|---|
| pre-clean | |
| clean | maven-clean-plugin:clean |
| post-clean | |
| -------------- | -------------- |
| pre-site | |
| site | maven-site-plugin:site |
| post-site | |
| site-deploy | maven-site-plugin:deploy |
相對于clean和site生命周期來說,default生命周期與插件目標(biāo)的綁定關(guān)系就顯得復(fù)雜一些。default生命周期的階段是插件目標(biāo)的綁定關(guān)系由項目打包類型(jar、war、pom等)所決定。
常見的打包類型有jar、war、pom、maven-plugin、ear等,它們的default生命周期與插件目標(biāo)的綁定關(guān)系請閱讀官方文檔,也可以從maven的命令行輸出中看到項目構(gòu)建過程執(zhí)行了哪些插件目標(biāo)。
自定義綁定
一個常見的例子是創(chuàng)建項目的源碼jar包,內(nèi)置的插件綁定沒有涉及這一任務(wù),需要用戶自行配置。maven-source-plugin:jar-no-fork目標(biāo)可以幫助我們完成。
<!-- 構(gòu)建插件的基本配置 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<!-- 指定生命周期階段 -->
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
有時候不通過phase元素配置生命周期階段,插件目標(biāo)也能綁定到生命周期中。是因為插件的目標(biāo)在編寫時就定義了默認(rèn)的綁定階段。
如果多個目標(biāo)綁定到同一階段,會按照這些插件聲明的先后順序執(zhí)行。
插件配置
用戶可以配置插件目標(biāo)的參數(shù),進(jìn)一步調(diào)整插件目標(biāo)所執(zhí)行的任務(wù)??梢酝ㄟ^命令行和pom配置等方式來配置這些參數(shù)。
獲取插件
基本上所有主要的maven插件都來自apache和codehaus。apache的更穩(wěn)定些。
插件倉庫
與依賴構(gòu)件一樣,插件構(gòu)件同樣基于坐標(biāo)存儲在maven倉庫中。
解析插件前綴
maven-clean-plugin可以簡寫為clean。maven-compiler-plugin可以簡寫為compiler。
插件前綴與groupId:artifactId是一一對應(yīng)的,這種匹配關(guān)系存儲在倉庫元數(shù)據(jù)中。這里的元數(shù)據(jù)為groupId/maven-metadata.xml,這個groupId是指插件倉庫對應(yīng)的groupId,如前文所述的apache(http://repo1.maven.org/maven2/org/apache/maven/plugins/)和codehaus(...)。也可以通過settings.xml讓maven檢查其他groupId上的插件倉庫元數(shù)據(jù)。