在了解Maven的生命周期(lifecycle)之前,我們需要先了解Maven的Plugin與goal
通過(guò)上一篇文檔Maven的基本概念,我們了解到:goal是Maven中執(zhí)行任務(wù)的最基本的單元;plugin又是提供goal的主體。因此了解maven中的plugin和goal的基本規(guī)則,以及學(xué)會(huì)如何查找和如何使用合適的plugin、goal至關(guān)重要(就像使用vim一樣,要學(xué)會(huì)如何找到合適的第三方插件,以及學(xué)會(huì)如何使用這個(gè)插件一樣)。
Plugin的分類
Maven中Plugin分為兩種類型:
build類型Plugin只能在build階段執(zhí)行,在POM中需要在
<build/>標(biāo)簽下進(jìn)行配置。reporting類型:在site generation階段被執(zhí)行。在POM中需要在
<reporting/>標(biāo)簽下配置。
一些常見(jiàn)的Maven 官方的插件插件:
https://maven.apache.org/plugins/index.html
https://repo.maven.apache.org/maven2/org/apache/maven/plugins/
一些常見(jiàn)的Maven官方之外的,按照插件開(kāi)發(fā)規(guī)則添加的常用插件:
https://www.mojohaus.org/plugins.html
如何識(shí)別一個(gè)plugin與goal
標(biāo)識(shí)一個(gè)plugin的最規(guī)范的路徑是:groupId:artifactId:version。標(biāo)識(shí)一個(gè)goal的最規(guī)范的路徑為groupId:artifactId:version:goal。
例如執(zhí)行 mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:system 實(shí)際上就是執(zhí)行了 mvn help:system;這樣的使用方式主要是由于直接使用groupid,artifactid,version的方式是比較復(fù)雜的,所以在maven中引入的goalPrefix的概念,其實(shí)就是給上邊冗余的指定plugin的命名方式給了一個(gè)簡(jiǎn)稱。
Plugin的簡(jiǎn)稱/goalPrefix的命名規(guī)則
maven的plugin分為兩種類型,一種是maven官方發(fā)布的plugin,另一種是按照maven的plugin開(kāi)發(fā)要求開(kāi)發(fā)的第三方的plugin。plugin的prefix官方規(guī)則文檔介紹著兩種plugin的主要區(qū)別。
官方插件:都是使用org.apache.maven.plugins
作為groupid;其插件對(duì)應(yīng)的artifactid都是maven-prefixname/goalprefix-plugin的規(guī)則;maven官方的plugins metadata store給出了基本上可以用的官方plugin的全部?jī)?nèi)容,以及其對(duì)應(yīng)的goalprefix。第三方插件:org.codehaus.mojo 就是一個(gè)第三方插件的集合groupid,其中有非常多有用的插件;并且個(gè)人也可以按照plugin的dev文檔來(lái)開(kāi)發(fā)自己的第三方的插件,然后進(jìn)行發(fā)布。
如何自主學(xué)習(xí)某個(gè)Plugin的使用方法
在實(shí)際的plugin和goal的使用中需要解決兩個(gè)問(wèn)題:(1)如何找到能夠解決某個(gè)問(wèn)題的plugin;(2)如何學(xué)習(xí)這個(gè)plugin的多個(gè)goals的使用方式。
查找合適的plugin的方法:一般可以通過(guò)官方提供Available Plugins;或者通過(guò)一些比較常用的第三方plugin集合(org.codehaus.mojo )中尋找合適的插件。
-
學(xué)習(xí)某個(gè)plugin如何使用:
-
使用plugin自帶的
helpgoal:例如直接使用mvn compiler:help可以查看對(duì)應(yīng)的compiler插件有多個(gè)少個(gè)goals。image.png
并且還可以進(jìn)一步通過(guò)mvn compiler:help -Ddetail=true -Dgoal=<goal-name>來(lái)查看詳細(xì)的每一個(gè)goal對(duì)應(yīng)的參數(shù)使用方法。 使用maven的help插件的
describegoal來(lái)了解plugin和goals的功能;例如下邊的例子
-
mvn help:describe -Dcmd=compile
mvn help:describe -Dcmd=compiler:compile
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin
mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-compiler-plugin
Plugin在POM中如何配置
當(dāng)我們學(xué)會(huì)使用一個(gè)maven plugin的時(shí)候,在選擇執(zhí)行其對(duì)應(yīng)的某個(gè)goal的時(shí)候,可以添加上不同的參數(shù)來(lái)控制goal執(zhí)行的行為。例如 mvn plugin:help -Ddetail=true可以打印出plugin幫助信息的一些詳細(xì)參數(shù);或者使用mvn plugin:help -Dgoal=goalname
僅僅打印某個(gè)goal的幫助信息。
maven的官方文檔給出了如何對(duì)Plugin進(jìn)行配置。plugin分為兩種類型(build類型與reporting類型),這兩種類型有公共的部分,也有各自特殊的部分。
- 公共部分的配置:主要在于對(duì)應(yīng)的每一個(gè)不同goal的執(zhí)行所需要的parameters的配置上。在實(shí)現(xiàn)一個(gè)goal的時(shí)候,會(huì)定義不同的參數(shù),每一個(gè)參數(shù)都有其對(duì)應(yīng)的數(shù)據(jù)類型(比如簡(jiǎn)單的類型:string,boolean,int,double等;復(fù)雜的一些對(duì)象數(shù)據(jù)類型;甚至一些collections或者property類型。)主要的使用方式如下:
<configuration>
<url>http://www.baidu.com</url>
</configuration>
相當(dāng)于配置了對(duì)應(yīng)的goal中url的屬性為http://www.baidu.com
- build類型的plugin特殊的配置:這里主要說(shuō)下
executionstags,其他配置參數(shù)可以直接參考官方的文檔進(jìn)行學(xué)習(xí)。execution的主要作用是可以把一個(gè)插件的某個(gè)goal或者某些goals綁定到一個(gè)executionid上,或者綁定到某個(gè)phase上。例如下邊的這個(gè)例子
<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-myquery-plugin</artifactId>
<version>1.0</version>
<executions>
// 第一個(gè)execution配置
<execution>
<id>execution1</id>
<phase>test</phase>
<configuration>
<url>http://www.bar.com/query</url>
<timeout>15</timeout>
</configuration>
<goals>
<goal>query</goal>
</goals>
</execution>
// 第二個(gè)execution配置
<execution>
<id>execution2</id>
<configuration>
<url>http://www.bar.com/query</url>
<timeout>15</timeout>
<options>
<option>four</option>
<option>five</option>
<option>six</option>
</options>
</configuration>
<goals>
<goal>query</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
將同一個(gè)插件分別設(shè)置了多個(gè)exection,execution1是將其綁定到了test階段(phase)上;exection2并沒(méi)有綁定到任何階段。那么如下的兩個(gè)命令都分別可以執(zhí)行對(duì)應(yīng)的goal(query):
mvn test
mvn plugin:goal@execution2
- reporting部分使用的不是太多,具體使用的時(shí)候,可以直接查閱上面給到的plugin配置鏈接進(jìn)行查閱。
