咱们知道mvn 只是抽象了项目构建的生命周期,生命周期自己是不作任何工做的,具体的工做都是由插件来完成。每一个个插件都有一个或多个目标(goal),咱们一般执行的mvn命令就是去调用mvn的插件,html
如:mvn dependency:list , dependency 是插件前缀,list是插件的目标,denpendency插件还有其余的目标好比说:tree,analyze等。apache
咱们在执行mvn clean ,mvn install ,mvn compile的时候为何不像上面介绍的那样使用 mvn plugin:goal这种方式呢? 应为maven 为各个生命周期的主要阶段都绑定了默认的插件,因此咱们执行这些命令的时候是调用了默认的插件和目标。何为插件绑定?把一个生命周期的某个阶段和具体插件的某个目标关联起来,这就是插件绑定。bash
为了减小用户的配置,作到开箱即用,maven为咱们内置了一些默认的插件绑定:maven
clean:ui
default:url
site:spa
用户能够根据须要将某个插件的指定目标绑定到生命周期的某个阶段上。插件
方法:命令行
<build> <plugins> <plugin> <groupId>XXXX</groupId> <artifactId>XXXX</artifactId> <version>XXX</version> <excutions> <excution> <id>attach-source</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> </excution> </excutions> <plugin> </plugins> </build>
注意:code
mvn install -Dmaven.test.skip=true
经过-D加入参数,实现插件配置
<build> <plugins> <plugin> <groupId>XXXX</groupId> <artifactId>XXXX</artifactId> <version>XXX</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> <plugin> </plugins> </build>
为插件任务配置特定的参数,以下例:
<build> <plugins> <plugin> <groupId>XXXX</groupId> <artifactId>XXXX</artifactId> <version>XXX</version> <excutions> <excution> <id>attach-source</id> <phase>verify</phase> <goals> <goal>jar-no-fork</goal> </goals> <configuration> <tasks> <echo> validate phase </echo> </tasks> </configuration> </excution> </excutions> <plugin> </plugins> </build>
基本上maven全部的插件都来自apache和codehaus:
http://maven.apache.org/plugins/index.html
http://www.mojohaus.org/plugins.html
下面的例子是描述maven-compile-plugin插件:
mvn help:describe -Dplugin=compiler
上面命令里使用到了目标前缀(goal prefix),help 是maven-help-plugin的目标前缀,compiler是maven-compile-plugin的目标前缀。使用目标前缀能够简化咱们使用插件的方式,不用使用maven的坐标来调用插件。若是不使用前缀,上面的命令将变成:
mvn org.apache.maven.plugins:maven-help-plugin:2.1:describe -Dplugin=org.apache.maven.plugins:maven-compile-plugin:2.1
若只想查看关于插件目标的描述,能够在maven命令后加上-Dgoal=xxx,输出更详细的信息能够加上-Ddetail
咱们在命令行调用mvn 插件时,插件的名字是什么,gorupid,artifactid,version分别是什么,插件从哪里得到的?
maven有单独的插件仓库,配置方式与普通构建的远程仓库不一样,以下:
<pluginRepositories> <pluginRepository> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>repo</name> <url>http://maven:8081/artifactory/repo</url> </pluginRepository> <pluginRepository> <snapshots> <updatePolicy>always</updatePolicy> </snapshots> <id>snapshots</id> <name>repo</name> <url>http://maven:8081/artifactory/repo</url> </pluginRepository> </pluginRepositories>
id、name 、url等的含义与普通仓库一致,通常来讲中央仓库的所包含的插件已经可以知足咱们平常所需了,因此通常配置一个中央仓库的地址就能够,可是有点须要注意 插件的snapshot 通常都配置为 false,使用稳定版的插件。
在配置pom的时候若是是官方的插件,就能够省略goupid(org.apache.maven.plugins)。可是不推荐使用这种方式,省略的代码很少,可是会对不熟悉maven的同事形成费解。
maven在超级pom中为核心插件设置了版本,超级pom 是全部pom的父pom,因此即便咱们不配置核心插件的版本,这些核心插件仍然能经过父pom的配置找到版本。
若是没有指定版本,且使用的插件也不是核心插件,那么maven就会遍历远程仓库的元数据(groupid/)和本地仓库的元数据合并,得出latest和release,maven3中若没有指定版本号,则默认解析为release。保证插件的稳定。依赖maven解析插件版本是不可取的,即时解析的是非快照版,可是也不能保证新版本的逻辑不会改变,因此建议是显示的指定maven插件的版本。
解析插件前缀
maven插件前缀与groupid和artifactid 一一对应,这种匹配关系保存在 groupid/maven-metadata.xml中,若是不作任何配置,maven会默认使用org.apache.maven.plugins 和 org.codehaus.mojo这两个groupid解析仓库元数据。固然也能够在settings.xml中配置:
这样maven出了会从上述两个默认的goupid里去解析元数据以外,也会从配置的这个com.your.plugins下元数据的内容。
maven 解析插件的过成以下: