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