插件解析机制

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,以及用户自定义的插件组。若是全部元数据都不包含该前缀,则报错。

相关文章
相关标签/搜索