type
status
date
slug
summary
tags
category
icon
password
一、Maven 生命周期
参考 Maven Lifecycle,Maven 一共有三套标准生命周期:
- Clean 生命周期。
- Default 生命周期(也称为 Build 生命周期)。
- Site 生命周期。
Clean 生命周期
Clean 生命周期的目的是清理项目,它包括以下三个阶段。
- pre-clean:执行清理前需要完成的工作。
- clean:清理上一次构建过程中生成的文件,比如编译后的 class 文件等。
- post-clean:执行清理后需要完成的工作。
Default 生命周期
Default 生命周期定义了构建项目时所需要的执行步骤,它是所有生命周期中最核心部分,包括下面的 23 个阶段,比较常用的阶段用粗体标记。
名称 | 说明 |
validate | 验证项目结构是否正常,必要的配置文件是否存在 |
initialize | 做构建前的初始化操作,比如初始化参数、创建必要的目录等 |
generate-sources | 产生在编译过程中需要的源代码 |
process-sources | 处理源代码,比如过滤值 |
generate-resources | 产生主代码中的资源在 classpath 中的包 |
process-resources | 将资源文件复制到 classpath 的对应包中 |
compile | 编译项目中的源代码 |
process-classes | 产生编译过程中生成的文件 |
generate-test-sources | 产生编译过程中测试相关的代码 |
process-test-sources | 处理测试代码 |
generate-test-resources | 产生测试中资源在 classpath 中的包 |
process-test-resources | 将测试资源复制到 classpath 中 |
test-compile | 编译测试代码 |
process-test-classes | 产生编译测试代码过程的文件 |
test | 运行测试案例 |
prepare-package | 处理打包前需要初始化的准备工作 |
package | 将编译后的 class 和资源打包成压缩文件,比如 jar 或者 war |
pre-integration-test | 做好集成测试前的准备工作,比如集成环境的参数设置 |
integration-test | 集成测试 |
post-integration-test | 完成集成测试后的收尾工作,比如清理集成环境的值 |
verify | 检测测试后的包是否完好 |
install | 将打包的组件以构件的形式,安装到本地依赖仓库中,以便共享给本地的其他项目 |
deploy | 运行集成和发布环境,将测试后的最终包以构件的方式发布到远程仓库中,方便所有程序员共享 |
Site 生命周期
Site 生命周期的目的是建立和发布项目站点。Maven 可以基于 pom 所描述的信息自动生成项目的站点,同时还可以根据需要生成相关的报告文档集成在站点中,方便团队交流和发布项目信息。Site 生命周期包括如下阶段。
- pre-site:执行生成站点前的准备工作。
- site:生成站点文档。
- post-site:执行生成站点后需要收尾的工作。
- site-deploy:将生成的站点发布到服务器上。
生命周期、阶段和插件的默认绑定关系
在默认情况下,Maven 生命周期会绑定以下几个插件来执行基本操作(插件的具体介绍看下面)。没有绑定插件的阶段不会执行。
生命周期( Lifecycle ) | 阶段( Phase ) | 目标( Goal) |
clean | clean | maven-clean-plugin:clean |
default | process-resources | maven-resources-plugin:resources |
ㅤ | compile | maven-compiler-plugin:compile |
ㅤ | generate-test-resources | maven-resources-plugin:testResouces |
ㅤ | test-compile | maven-compiler-plugin:testCompile |
ㅤ | test | maven-surefire-plugin:test |
ㅤ | package | 打包类型是 jar 时:maven-jar-plugin:jar
打包类型是 war 时:maven-war-plugin:war |
ㅤ | install | maven-install-plugin:install |
ㅤ | deploy | maven-deploy-plugin:deploy |
site | site | maven-site-plugin:site |
ㅤ | site-deploy | maven-site-plugin:deploy |
二、Maven 插件
Maven 插件介绍
参考 Maven Plugins。Maven 实际上是一个插件(Plugin)的集成框架,每个插件对应一到多个目标(global),每个目标完成一个特定的任务。Maven 的所有任务都是通过插件及其对应的目标来完成的。上面 生命周期、阶段和插件的默认绑定关系 介绍的内置插件如下
插件 | 作用 | 对应阶段 |
maven-clean-plugin | 清理上一次执行创建的目标文件 | clean |
maven-resources-plugin | 处理源资源文件和测试资源文件,包括 src/main/resources 和 src/test/resources 下的资源文件 | resources,testResources |
maven-compiler-plugin | 编译源文件和测试源文件,包括 src/main/java 和 src/test/java 目录下的类文件 | compile,testCompile |
maven-surefire-plugin | 运行 JUnit 单元测试,其实大部分时间内,只要你的测试类遵循通用的命令约定(以Test结尾、以TestCase结尾、或者以Test开头) | test |
maven-jar-plugin | 把项目打包成 jar 包 | jar |
maven-war-plugin | 把项目打包成 war 包 | war |
maven-install-plugin | 将创建生成的 jar 拷贝到本地仓库 | install |
maven-deploy-plugin | 发布 jar 到远程仓库 | deploy |
maven-site-plugin | 发布项目站点 | site |
除了这些内置的 Maven 插件,我们项目中常用的插件如下:
插件 | 作用 |
maven-archetype-plugin | 生成简单的 Maven 项目骨架,例如初学者常用的 mvn archetype:generate |
maven-assembly-plugin | 制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。 |
maven-dependency-plugin | 分析项目依赖并打包项目依赖到指定文件夹。 |
maven-failsafe-plugin | 用作集成测试的配置。 |
maven-checkstyle-plugin | 帮助开发检测代码中不合规范的地方。 |
spring-boot-maven-plugin | Spring Boot 项目专用帮助项目打包成一个fat jar。 |
jacoco-maven-plugin | 生成单元测试覆盖率报告。 |
sonar-maven-plugin | 使用该插件执行sonar扫描。 |
这些插件的配置方法参考这个地址。
用户调用 Maven 插件执行目标有两种方式:
- 输入生命周期调用插件目标。生命周期阶段是与插件目标绑定的,这样用户只需要输入生命周期阶段就可以调用对应的插件目标,如果绑定了多个插件目标将会顺序执行(这种需要我们事先把插件绑定到生命周期的阶段上,一般通过 Pom 文件进行绑定)。例如
Maven 默认将
maven-compiler-plugin
的 compile
目标与 compile
生命周期阶段绑定,因此命令 mvn compile
实际上是先定位到 compile
这一生命周期阶段,然后再根据绑定关系调用 maven-compiler-plugin
执行 compile
目标。- 在命令行指定要执行的插件目标。例如
表示调用
maven-archetype-plugin
的 generate
目标,这种调用方式不需要绑定生命周期的阶段。Pom 文件绑定插件
在 pom.xml 文件中,使用
build
元素的 plugin
元素定义插件目标并绑定到 Maven 生命周期阶段。例如在上面的配置中,我们定义了
my-maven-plugin
插件,并在其元素中定义了一个 execution
为 my-goal
,对应的 goal
为 myGoal
,绑定到了 Maven 的 compile
阶段。这样,当我们在执行 mvn compile
命令时,myGoal
目标就会被执行。通过插件绑定,我们可以方便地将插件目标集成到 Maven 的生命周期中,从而在构建过程中自动执行它们。
Maven 命令执行插件
不管是生命周期绑定的插件,还是命令行参数直接输入的插件,要执行执行插件的话最终还是要使用 Maven 命令。Maven 命令的格式如下:
例如下面命令表示执行编译插件
maven-compiler-plugin
的 compile 目标用来编译 src/main/java/
目录下的代码 输出日志如下,可以看到 Maven 项目使用默认的内置插件
maven-resources-plugin
和 maven-compiler-plugin
分别执行了 resources
和 compile
两个阶段。这也印证之前的结论,在执行某个阶段的时候,该阶段前面的所有阶段(已经绑定插件)都会被执行。插件参数
Maven 的插件参数的配置也有两种方式:
- 直接在命令行通过 -D 属性设置。这种相当于修改了
properties
元素的属性值。-D
表示配置properties
属性,-P
表示配置profiles
属性。如果属性值在 pom.xml 已经存在,传递的参数值会覆盖原来的属性值。例如
- 在 pom.xml 文件的
plugin
元素里面通过configuration
元素设置。例如设置 JDK 的编译版本为 1.8。
- Author:mcbilla
- URL:http://mcbilla.com/article/3bd0470c-0a49-4f60-876c-a6acbe6d4346
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts