咱們知道mvn 只是抽象了項目構建的生命週期,生命週期自己是不作任何工做的,具體的工做都是由插件來完成。每一個個插件都有一個或多個目標(goal),咱們一般執行的mvn命令就是去調用mvn的插件,html
如:mvn dependency:list , dependency 是插件前綴,list是插件的目標,denpendency插件還有其餘的目標好比說:tree,analyze等。apache
咱們在執行mvn clean ,mvn install ,mvn compile的時候爲何不像上面介紹的那樣使用 mvn plugin:goal這種方式呢? 應爲maven 爲各個生命週期的主要階段都綁定了默認的插件,因此咱們執行這些命令的時候是調用了默認的插件和目標。何爲插件綁定?把一個生命週期的某個階段和具體插件的某個目標關聯起來,這就是插件綁定。bash
爲了減小用戶的配置,作到開箱即用,maven爲咱們內置了一些默認的插件綁定:maven
clean:ui
default:url
site:spa
用戶能夠根據須要將某個插件的指定目標綁定到生命週期的某個階段上。插件
方法:命令行
<build> <plugins> <plugin> <groupId>XXXX</groupId> <artifactId>XXXX</artifactId> <version>XXX</version> <excutions> <excution> <id>attach-source</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </excution> </excutions> <plugin> </plugins> </build>
注意:code
mvn install -Dmaven.test.skip=true
經過-D加入參數,實現插件配置
<build> <plugins> <plugin> <groupId>XXXX</groupId> <artifactId>XXXX</artifactId> <version>XXX</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> <plugin> </plugins> </build>
爲插件任務配置特定的參數,以下例:
<build> <plugins> <plugin> <groupId>XXXX</groupId> <artifactId>XXXX</artifactId> <version>XXX</version> <excutions> <excution> <id>attach-source</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> <configuration> <tasks> <echo> validate phase </echo> </tasks> </configuration> </excution> </excutions> <plugin> </plugins> </build>
基本上maven全部的插件都來自apache和codehaus:
http://maven.apache.org/plugins/index.html
http://www.mojohaus.org/plugins.html
下面的例子是描述maven-compile-plugin插件:
mvn help:describe -Dplugin=compiler
上面命令裏使用到了目標前綴(goal prefix),help 是maven-help-plugin的目標前綴,compiler是maven-compile-plugin的目標前綴。使用目標前綴能夠簡化咱們使用插件的方式,不用使用maven的座標來調用插件。若是不使用前綴,上面的命令將變成:
mvn org.apache.maven.plugins:maven-help-plugin:2.1:describe -Dplugin=org.apache.maven.plugins:maven-compile-plugin:2.1
若只想查看關於插件目標的描述,能夠在maven命令後加上-Dgoal=xxx,輸出更詳細的信息能夠加上-Ddetail
咱們在命令行調用mvn 插件時,插件的名字是什麼,gorupid,artifactid,version分別是什麼,插件從哪裏得到的?
maven有單獨的插件倉庫,配置方式與普通構建的遠程倉庫不一樣,以下:
<pluginRepositories> <pluginRepository> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>repo</name> <url>http://maven:8081/artifactory/repo</url> </pluginRepository> <pluginRepository> <snapshots> <updatePolicy>always</updatePolicy> </snapshots> <id>snapshots</id> <name>repo</name> <url>http://maven:8081/artifactory/repo</url> </pluginRepository> </pluginRepositories>
id、name 、url等的含義與普通倉庫一致,通常來講中央倉庫的所包含的插件已經可以知足咱們平常所需了,因此通常配置一箇中央倉庫的地址就能夠,可是有點須要注意 插件的snapshot 通常都配置爲 false,使用穩定版的插件。
在配置pom的時候若是是官方的插件,就能夠省略goupid(org.apache.maven.plugins)。可是不推薦使用這種方式,省略的代碼很少,可是會對不熟悉maven的同事形成費解。
maven在超級pom中爲核心插件設置了版本,超級pom 是全部pom的父pom,因此即便咱們不配置核心插件的版本,這些核心插件仍然能經過父pom的配置找到版本。
若是沒有指定版本,且使用的插件也不是核心插件,那麼maven就會遍歷遠程倉庫的元數據(groupid/)和本地倉庫的元數據合併,得出latest和release,maven3中若沒有指定版本號,則默認解析爲release。保證插件的穩定。依賴maven解析插件版本是不可取的,即時解析的是非快照版,可是也不能保證新版本的邏輯不會改變,因此建議是顯示的指定maven插件的版本。
解析插件前綴
maven插件前綴與groupid和artifactid 一一對應,這種匹配關係保存在 groupid/maven-metadata.xml中,若是不作任何配置,maven會默認使用org.apache.maven.plugins 和 org.codehaus.mojo這兩個groupid解析倉庫元數據。固然也能夠在settings.xml中配置:
這樣maven出了會從上述兩個默認的goupid裏去解析元數據以外,也會從配置的這個com.your.plugins下元數據的內容。
maven 解析插件的過成以下: