插件解析機制

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,以及用戶自定義的插件組。若是全部元數據都不包含該前綴,則報錯。

相關文章
相關標籤/搜索