一、生命周期
Maven拥有三套相互独立的生命周期,他们分别为clean、default和site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点。三套生命周期相互独立,且每个生命周期中的命令按照顺序执行。
1、clean生命周期包含三个阶段:
pre-clean:执行一些清理前需要完成的工作;
clean:清理上一次构建生成的文件;
post-clean:执行一些清理后需要完成的工作。
2、default生命周期定义了真正构建时所需要执行的所有步骤,是生命周期中最核心的部分,包含阶段如下:
validate → initialize → generate-sources → process-sources(处理项目主资源文件。一般来说,是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中) →
generate-resources →process-resources →
compile(编译项目的主源码。一般来说,是编译src/main/java目录下的java文件至项目输出的主classpath目录中) → process-classes → generate-test-sources → process-test-sources(处理项目测试资源文件) → generate-test-resources →process-test-resources →
test-compile(编译项目的测试代码) → process-test-classes → test(使用单元测试框架运行测试,测试代码不会被打包或部署) → prepare-package →
package(接收编译好的代码,打包成可发布的格式,如JAR) → pre-integration-test → integration-test → post-integration-test → verify → install(将包安装到Maven本地仓库,供其他Maven项目使用) →
deploy(将最终的包复制到远程仓库,供其他开发人员和Maven项目使用)
3、site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点。
pre-site:执行一些生成站点前的工作;
site:生成项目站点文档;
post-site:执行生成站点后的工作;
site-deploy:将站点发布到服务器上。
二、命令行与生命周期
命令行执行的命令就是调用Maven生命周期的不同阶段。
如:mvn clean(调用执行clean生命周期的pre-clean和clean阶段),
mvn clean install(调用clean生命周期的pre-clean和clean阶段,default生命周期的validate到install所有阶段)。
三、插件
1、插件目标
Maven执行生命周期的任务是由插件来完成的,每个插件都会包含好几个功能
(如maven-dependency-plugin,它能够分析项目依赖;列出项目依赖树;列出项目所有已解析的依赖等),
每个功能就是一个插件目标。上述dependency插件对应的目标依次为:dependency:analyze、dependency:tree、dependency:list,
这是一种通用写法,冒号前面是插件前缀,冒号后面是该插件的目标。
2、插件绑定
Maven生命周期中的每一个命令都与某个插件的目标绑定。在内置绑定中可以看到如下内置绑定(打包类型为jar):
当然,我们也可以在maven生命周期中自定义绑定插件目标,如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
executions下的每一个execution子元素可用来配置执行一个任务。该配置中配置了一个id为attach-sources的任务,通过phase配置,将其绑定到verify生命周期阶段上,再通过goals配置指定要执行的插件目标。
有时候,即使不通过phase元素配置生命周期阶段,插件目标也能够绑定到生命周期中去。
因为很多插件目标在编写时已经定义了默认绑定阶段,
可以使用maven-help-plugin查看插件详细信息:
运行如下命令:mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail 。
3、插件配置
几乎所有Maven插件的目标都有一些可配置的参数,Maven命令中使用-D参数,并伴随一个参数键=参数值的形式。
例如:mvn install -Dmaven.test.skip=true
maven-surefire-plugin提供了一个maven.test.skip参数,当值为true的时候,就会执行跳过测试。
在pom中可以对插件进行全局配置,如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
在任何阶段都使用Java1.6进行编译。4、获取插件信息
引用之前使用过的命令
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail ,
利用maven-help-plugin插件可以获取想要查看插件的详细信息,这里执行maven-help-plugin的describe目标,
在命令行输出maven-source-plugin的简要信息,包括该插件的坐标、目标前缀(Goal Prefix,相当于代替了某个插件)和目标等,如图:
另外,在描述插件的时候,还可以省去版本信息,让Maven自动获取最新版本来进行表述:
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin
进一步简化,可以使用插件目标前缀替换坐标:
mvn help:describe -Dplugin=source