1、生命週期和插件的關係
maven的生命週期爲所有的建構過程進行了抽象和統一,包括清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等,但是生命週期是抽象的,所以生命週期並不實際實現這些操作,而這些實際的操作步驟就是由插件來完成。其中每個建構步驟都可以綁定一個或多個插件行爲,而且maven爲大多數的建構步驟已經綁定了默認的插件,例如,針對編譯的插件有maven-compiler-plugin,針對測試的插件有maven-surefire-plugin等,有些情況下用戶甚至可以自己編寫插件。
2、插件目標
一般一個插件往往能完成多個任務(功能),例如maven-dependency-plugin,它既能夠分析項目依賴,幫助找出潛在的無用依賴;還能夠列出項目的依賴樹,幫助分析依賴來源;除此之外,它還能列出項目所有已介系的依賴等。
如果每一個功能就編寫一個插件,則太過繁瑣,而且每個功能裏面有很多可以複用的代碼,所以解決辦法就是將某些功能集成在一個插件裏面實現,這裏面的一個功能就是一個插件目標。
插件目標的描述方法:compiler:compile,表示的是maven-compiler-plugin的compile目標。
3、細節關係
maven生命週期和插件的綁定關係其實是基於生命週期裏面的階段和插件裏面的目標的綁定來實現的。
上圖說明了default、生命週期中的compile階段是與maven-compiler-plugin插件的compile目標綁定的。
4、maven默認綁定
用戶在使用的時候一般都沒有注意到上述的綁定關係,這是因爲maven已經內置默認綁定了,以下是三個生命週期各自與插件目標的默認綁定關係:
5、用戶自定義綁定
除了maven默認綁定外,當然也應該讓用戶可以自己選擇某個插件目標綁定到生命週期的某個階段上,可以使用pom文件中<build>元素,以下是創建項目的源碼jar包,內置的插件沒有綁定這一任務(功能):
<pre name="code" class="html"><build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artfactId>maven-source-plugin</artfactId>
<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>
該例中使用maven-sources-plugin插件,用<plugin>元素指定,executions下每一個execution子元素可以用來配置一個任務,該例中<execution>元素配置了一個id爲attach-sources的任務(這個id可以任意定,但唯一?),並且通過<phase>指定將其綁定到default生命週期verify階段上,最後通過<goals>配置指定要執行的插件目標。
運行mvn verify,得到:
可以看到,當執行verify階段的時候,maven-sources-plugin:jar-no-fork目標會執行,創建一個億source.jar結尾的源碼jar包。
注意:有時不一定需要<phase>元素,插件目標仍然能夠綁定到生命週期中去。例如上例中去掉<phase>元素,再執行mvn verify,仍然得到一樣的結果。因爲很多插件目標在編寫的時候定義了默認綁定階段(可以使用maven-help-plugin查看插件詳細信息)。運行名利:mvn help:describe -Dplugin=groupId:artfactId:version -Ddetail
6、插件配置
- 從命令行
在日常使用的過程中,一般從命令行中設置插件,使用“-D參數鍵=參數值”來配置
eg.mvn install -Dmaven.test.skip=true
運行該命令,在再install的過程中跳過測試階段。
- 從pom文件
如果一些插件的配置很少改變,則可以配置在pom文件中,不用每次輸入命令行進行配置。
<pre name="code" class="html"><build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artfactId>maven-source-plugin</artfactId>
<version>2.1.1</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
該例中<source>的含義是maven-compiler-plugin所要編譯的源文件是java1.5版本的,而<target>的含義是在maven-compiler-plugin在進行編譯的時候都是基於java1.5版本進行編譯的,不管是編譯源代碼還是編譯測試代碼。