简述
mvn的生命周期是为了所有的构建过程进行抽象和统一,mvn的生命周期包括清理、编译、测试、打包、集成测试、验证、部署和站点生成。mvn的生命周期是抽象的,它只是定义了一个构件的过程,具体每个过程做什么是由mvn插件实现的。
三套生命周期
- mvn有三套生命周期,分别为clean、default、site,每个生命周期是相互独立的。
- 每个生命周期包含一些阶段(phase),这些阶段是固定且有序的,后面的阶段依赖与前面的阶段。当用户调用default生命周期的complile阶段时,不会调用clean生命周期的阶段
clean生命周期
- pre-clean 阶段 执行一些清理前需要完成的工作
- clean 清理上一次构建生成的文件
- post-clean 执行一些清理后完成的工作
default 生命周期
default 生命周期定义了真正构建需要执行的所有步骤,是所有生命周期的最核心的部分,有如下的阶段(phase)
- validate
- initialize 初始化
- generate-sources 生成src
- process-sources 处理项目代码
- generate-resources 生成项目的资源文件
- process-resources 处理项目的资源文件
- compile 编译项目的主代码
- process-classed
- generate-test-sources 生成测试代码
- generate-test-sources 处理测试的代码
- generate-test-resources
- process-test-resources
- test-compile 编译测试代码
- process-test-classed
- test 使用单元测试框架运行测试
- prepare-package
- package 打包编译代码,如jar,war
- pre-integration-test
- integration-test
- post-integration-test
- verify 验证
- install 将包安装到本地仓库
- deploy 将包部署到远程仓库
site生命周期
site生命周期的目的是建立和发布站点,包括如下阶段
- pre-site
- site 生成项目站点文档
- post-site
- site-deploy 将站点发布到服务器上
常用生命周期的命令行操作
mvn clean 执行clean生命周期的 pre-clean和clean阶段
mvn test 执行default的生命周期的阶段,直到test的所有阶段
mvn clean install
mvn clean deploy site-deploy
插件的目标
mvn的生命周期和对应的阶段只是定义了一个项目编译的流程,并没有具体的实现,具体的实现是在插件的目标中定义的。因此我们可以把插件的目标与生命周期的阶段绑定来定制具体的编译动作。
既将插件的目标与生命周期的阶段进行绑定。
内置绑定
为了让用户不用任何配置就能构建mvn项目,mvn为生命周期的某些阶段默认的绑定了一些插件。
clean生命周期阶段
阶段 | 插件目标 |
---|---|
pre-clean | - |
clean | maven-clean-plugin:clean |
post-clean | - |
site生命周期
阶段 | 绑定目标 |
---|---|
pre-site | - |
site | maven-site-plugin:site |
post-site | - |
site-deploy | maven-site-plugin:deploy |
default 生命周期绑定的插件(jar打包方式)
阶段 | 绑定插件 | 执行任务 |
---|---|---|
process-resources | maven-resource-plugin:resources | 复制主资源文件至主输出目录 |
compile | maven-compiler-plugin:compile | 编译主代码至输出目录 |
process-test-resources | maven-resource-plugin :testResources | 复制测试资源文件到测试目录 |
test-compile | maven-compiler-plugin:testCompile | 编译测试代码到测试输出目录 |
test | maven-surefire-plugin:test | 执行测试用例 |
package | maven-jar-plugin:jar | 创建项目jar包 |
install | maven-install-plugin:install | 安装到本地仓库 |
deploy | maven-deploy-plugin:deploy | 发布到远程仓库 |
这里只列出了绑定了目标的阶段,default还有其他很多阶段没有绑定目标。因此没有实际的行为。
处理jar的打包方式外,mvn还其他的打包方式,具体的默认绑定行为参考官方文档
自定义绑定
除了内置绑定外,用户还可以自定义将插件的目标绑定到某个阶段上。
一个常见的例子是创建项目的源码jar包,可以通过maven-source-plugin插件的jar-no-fork目标完成这个任务,
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
默认的groupId
org.apache.maven.plugins 是mvn官方插件默认的groupId
插件的全局配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<fork>true</fork>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
这样不管是绑定到compile阶段的maven-compiler-plugin:compile任务还是testCompile任务都会根据1.8进行编译。
mvn插件信息获取
http://maven.apache.org/plugins/index.html 官方插件信息列表
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 -Ddetail 用命令查看插件的信息
mvn help:describe -Dplugin=compiler 插件的前缀简化版
mvn help:describe -Dplugin=compiler -Dgoal=compile 只查询某个目标的信息
mvn help:describe -Dplugin=compiler -Dgoal=compile -Ddetail 增加详细信息参数
插件版本的解析
在用户没有指定插件版本的情况下,mvn会自动解析插件的版本。
- 首先,mvn在超级的pom中为所有的核心插件都设置了默认的版本,因此在使用核心插件的时候如没有指定版本,使用的则是超级pom中定义的版本
- 如果用户使用的插件不是核心插件,又没有指定版本,mvn会遍历所有的仓库,获取所有可用的版本,之后使用最新的非快照版本。这里的解析是通过groupId/artifactId/maven-metadata.xml实现的
插件前缀的解析
mvn命令可以通过简化前缀的方式简化的调用,这里的前缀是和groupId:artifactId一一对应的,这种关系存贮在仓库的元数据中,这里的元数据为groupId/maven-metedata.xml,相应的mvn在解析仓库元数据的时候,默认会使用org.apache.maven.plugins和org.codehaus.mojo两个groupId,也可以配置settings让mvn检查其他的元数据
如下:
<settings>
<pluginGrouops>
<pluginGroup>com.your.plugins</pluginGroup>#这样就可以定制自己的插件的前缀了
</pluginGrouops>
</settings>