1. 插件倉庫:apache
與依賴構件同樣,插件構件一樣基於座標存儲在Maven倉庫中。值得一提的是,Maven會區別對待依賴的遠程倉庫與插件的遠程倉庫。當Maven須要的依賴在本地倉庫不存在時,它會去所配置的遠程倉庫尋找。但是當Maven須要的插件在本地倉庫不存在時,它就不會去這些遠程倉庫查找。maven
插件的遠程倉庫使用pluginRepositories和pluginRepository配置。例如Maven內置了以下的插件遠程倉庫配置:url
<pluginREpositories> <pluginREpository> <id>central</id> <name>Maven Plugin Repository</name> <url>http://repol.maven.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </releases> </pluginREpository> </pluginREpositories>
能夠看到這個默認插件倉庫的地址就是中央倉庫,它關閉了對SNAPSHOT的支持,以防止引入SNAPSHOT版本的插件而致使不穩定的構建。插件
2. 插件的默認groupId:code
在POM中配置插件的時候,若是該插件是Maven的官方插件(groupId爲org.apache.maven.plugins),就能夠省略groupId配置。不過這種作法不推薦。xml
3. 解析插件版本:繼承
爲了簡化插件的配置和使用,在用戶沒有提供插件版本的狀況下,Maven會自動解析插件版本。it
首先,Maven在超級POM中爲全部的核心插件設定了版本,超級POM是全部Maven項目的父POM,全部項目都繼承了這個超級POM的配置,所以即便用戶不加任何配置,Maven使用核心插件的時候,它們的版本就已經肯定了。這些插件包括maven-clean-plugin、maven-compiler-plugin、maven-surefire-plugin等。io
對於Maven3,當插件沒有聲明版本的時候,會解析至release。依賴Maven解析插件版本是不推薦的作法。在使用插件的時候,應該一直顯式地設定版本。class
4. 解析插件前綴:
插件前綴與groupId:artifactId是一一對應的,這種匹配關係存儲在倉庫元數據中。這裏的倉庫元數據爲groupId/maven-metadata.xml,那麼這裏的groupId是什麼呢?咱們已經知道,主要的插件都是Apache和Codehaus提供,相應地,Maven在解析插件倉庫元數據的時候,會默認使用org.apache.maven.plugins和org.codehaus.mojo兩個groupId。也能夠經過配置settings.xml讓Maven檢查其餘groupId上的插件倉庫元數據:
<settings> <pluginGroups> <pluginGroup>com.your.plugins</pluginGroup> </pluginGroups> </settings>
基於該配置,Maven就不單單會檢查org/apache/maven/plugins/maven-metadata.xml和org/codehaus/mojo/maven-metadata.xml,還會檢查com/your/plugins/maven-metadata.xml。
下面看一下插件倉庫元數據的內容:
<metadata> <plugins> <plugin> <name>Maven Clean Plugin</name> <prefix>clean</prefix> <artfactId>maven-clean-plugin</artfactId> </plugin> <plugin> <name>Maven Compiler Plugin</name> <prefix>compiler</prefix> <artfactId>maven-compiler-plugin</artfactId> </plugin> <plugin> <name>Maven Dependency Plugin</name> <prefix>dependency</prefix> <artfactId>maven-dependency-plugin</artfactId> </plugin> </plugins> </metadata>
當Maven解析到dependency:tree這樣命令後,它首先基於默認的groupId歸併全部插件倉庫的元數據org/apache/maven/plugins/maven-metadata.xml;其次檢查歸併後的元數據,找到對應的artifactId爲maven-dependency-plugin;而後結合當前元數據的groupId爲org.apache.maven.plugins;最後使用xx方法解析獲得version,這時就獲得了完整的插件座標。若是org/apache/maven/plugins/maven-metadata.xml沒有記錄該插件前綴,則接着檢查其餘groupId下的元數據,如org/codehaus/mojo/maven-metadata.xml,以及用戶自定義的插件組。若是全部元數據都不包含該前綴,則報錯。