讀古今文學網 > Maven實戰 > 7.8.4 解析插件前綴 >

7.8.4 解析插件前綴

前面講到mvn命令行支持使用插件前綴來簡化插件的調用,現在解釋Maven如何根據插件前綴解析得到插件的坐標。

插件前綴與groupId:artifactId是一一對應的,這種匹配關係存儲在倉庫元數據中。與之前提到的groupId/artifactId/maven-metadata.xml不同,這裡的倉庫元數據為groupId/maven-metadata.xml,那麼這裡的groupId是什麼呢?第7.6.1節提到主要的插件都位於http://repo1.maven.org/maven2/org/apache/maven/plugins/和http://repository.codehaus.org/org/codehaus/mojo/,相應地,Maven在解析插件倉庫元數據的時候,會默認使用org.apache.maven.plugins和org.codehaus.mojo兩個groupId。也可以通過配置settings.xml讓Maven檢查其他groupId上的插件倉庫元數據:

基於該配置,Maven就不僅僅會檢查org/apache/maven/plugins/maven-metadata.xml和org/codehaus/mojo/maven-metadata.xml,還會檢查com/your/plugins/maven-metadata.xml。

下面看一下插件倉庫元數據的內容,見代碼清單7-10。

代碼清單7-10 插件倉庫元數據

上述內容是從中央倉庫的org.apache.maven.plugins groupId下插件倉庫元數據中截取的一些片段,從這段數據中就能看到maven-clean-plugin的前綴為clean,maven-compiler-plugin的前綴為compiler,maven-dependency-plugin的前綴為dependency。

當Maven解析到dependency:tree這樣的命令後,它首先基於默認的groupId歸並所有插件倉庫的元數據org/apache/maven/plugins/maven-metadata.xml;其次檢查歸並後的元數據,找到對應的artifactId為maven-dependency-plugin;然後結合當前元數據的groupId org.apache.maven.plugins;最後使用第7.8.3節描述的方法解析得到version,這時就得到了完整的插件坐標。如果org/apache/maven/plugins/maven-metadata.xml沒有記錄該插件前綴,則接著檢查其他groupId下的元數據,如org/codehaus/mojo/maven-metadata.xml,以及用戶自定義的插件組。如果所有元數據中都不包含該前綴,則報錯。