7.8 插件解析机制

为了方便用户使用和配置插件,Maven不需要用户提供完整的插件坐标信息,就可以解析得到正确的插件,Maven的这一特性是一把双刃剑,虽然它简化了插件的使用和配置,可一旦插件的行为出现异常,用户就很难快速定位到出问题的插件构件。例如mvn help:system这样一条命令,它到底执行了什么插件?该插件的groupId、artifactId和version分别是什么?这个构件是从哪里来的?本节就详细介绍Maven的运行机制,以让读者不仅知其然,更知其所以然。

7.8.1 插件仓库

与依赖构件一样,插件构件同样基于坐标存储在Maven仓库中。在需要的时候,Maven会从本地仓库寻找插件,如果不存在,则从远程插件仓库查找。找到插件之后,再下载到本地仓库使用。

值得一提的是,Maven会区别对待依赖的远程仓库与插件的远程仓库,第6.4节介绍了如何配置远程仓库,但那种配置只对一般依赖有效果。当Maven需要的依赖在本地仓库不存在时,它会去所配置的远程仓库查找,可是当Maven需要的插件在本地仓库不存在时,它就不会去这些远程仓库查找。

不同于repositories及其repository子元素,插件的远程仓库使用pluginRepositories和pluginRepository配置。例如,Maven内置了如下的插件远程仓库配置,见代码清单7-7。

代码清单7-7 Maven内置的插件仓库配置


<pluginRepositories>

<pluginRepository>

<id>central</id>

<name>Maven Plugin Repository</name>

<url>http://repo1.maven.org/maven2</url>

<layout>default</layout>

<snapshots>

<enabled>false</enabled>

</snapshots>

<releases>

<updatePolicy>never</updatePolicy>

</releases>

</pluginRepository>

</pluginRepositories>


除了pluginRepositories和pluginRepository标签不同之外,其余所有子元素表达的含义与第6.4节所介绍的依赖远程仓库配置完全一样。我们甚至看到,这个默认插件仓库的地址就是中央仓库,它关闭了对SNAPSHOT的支持,以防止引入SNAPSHOT版本的插件而导致不稳定的构建。

一般来说,中央仓库所包含的插件完全能够满足我们的需要,因此也不需要配置其他的插件仓库。只有在很少的情况下,项目使用的插件无法在中央仓库找到,或者自己编写了插件,这个时候可以参考上述的配置,在POM或者settings.xml中加入其他的插件仓库配置。