在IntelliJ IDEA中,显示了Maven的Lifecycle:

只需要学习这些命令,就能构建一个Maven项目。

三个内置生命周期

Maven内置了三个生命周期:clean、default和site。生命周期是由多个顺序执行的阶段组成,它们的关系和说明如下:

clean

清理文件。

  • pre-clean clean前置阶段
  • clean 移除上次构建生成的所有文件
  • post-clean clean后置阶段

default

主要生命周期,用来构建应用。

  • validate 验证项目正确,必要信息有效
  • initialize 初始化构建状态,比如设置属性或创建目录
  • generate-sources 生成编译的源代码
  • process-sources 处理源代码,比如过滤任意值
  • generate-resources 生成包中的资源文件
  • process-resources 复制和处理资源文件到目标目录,为打开做准备
  • compile 编译项目的源码
  • process-classes 后处理(post-process)编译源代码生成的文件,比如给Java class文件做bytecode enhancement
  • generate-test-sources 生成编译的测试代码
  • process-test-sources 处理测试代码,比如过滤任意值
  • generate-test-resources 创建测试需要的资源
  • process-test-resources 复制和处理资源文件到测试目录
  • test-compile 编译测试代码到测试目录
  • process-test-classes 后处理(post-process)编译测试代码生成的文件,比如给Java class文件做bytecode enhancement
  • test 使用单元测试框架(如JUnit)执行测试,这些测试不能依赖已经打包(packaged)或部署(deployed)的代码
  • prepare-package 打包前准备,一般会生成处理过的未打包的前置版本包
  • package 将编译后的代码进行打包,比如jar包、war包
  • pre-integration-test 集成测试前置阶段,比如创建环境
  • integration-test 集成测试,在环境中进行测试
  • post-integration-test 集成测试后置阶段,比如清理环境
  • verify 验证包有效且质量达标
  • install 安装包到本地仓库,以便于本地项目依赖
  • deploy 复制包到远程仓库,共享给其他人使用

site

一般用来创建文档。

  • pre-site 前置阶段
  • site 生成项目的网站文档
  • post-site 后置阶段
  • site-deploy 把生成的网站文档部署到web服务器

命令行执行

Maven提供了一个mvn命令,把它的路径(如D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\plugins\maven\lib\maven3\bin)添加到环境变量就能直接使用。

  • mvn verify 如果不知道执行什么命令,可以执行这条命令,它会把前置命令都执行了:validate,compile,test,package。同时也会执行代码检查比如checkstyle,以及集成测试。
  • mvn clean deploy 常用来清理构建部署到仓库,如果项目有多个子模块,Maven会遍历所有模块执行。

对于pre-*, post-*, process-*等短横线命名的阶段则不能使用命令行直接执行,它们主要用来生成中间结果。比如单元测试覆盖率工具Jacoco和执行容器插件Docker可能会绑定到pre-integration-test来准备集成测试环境,然后在post-integration-test来收集覆盖率统计或者销毁容器。Failsafe和Code coverage插件绑定到了integration-test和verify两个阶段,在verify执行后生成测试报告。如果执行verify是没有问题的,但是如果直接执行integration-test,就可能导致无法生成测试报告,甚至集成测试环境也没有被彻底清理。

IntelliJ IDEA集成了所有没有短横线命名的这些可以直接执行的命令。

Plugin Goals

Maven除了生命周期的阶段,还提供了一个更精细的任务,叫做插件目标(Plugin Goals)。示例:

mvn clean dependency:copy-dependencies package

dependency:copy-dependencies就是一个插件目标,表达式为plugin:goal。

其实阶段都是由插件目标组成的,Maven默认进行了绑定,比如clean:clean、compiler:compile、deploy:deploy等。package阶段打包类型不同插件目标也有区别:jar:jar、war:war。

一个典型的打jar包的阶段和插件目标如下图所示:

Plugin

Plugin是用来给Maven提供goals的,比如Compiler plugin包括2个goals:compile用来编译main源代码,testCompile用来编译测试代码。Plugin在pom.xml中进行配置,比如:

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>id.validate</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>validate phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>id.compile</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>compile phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>id.test</id>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>test phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>id.package</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>package phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>id.deploy</id>
<phase>deploy</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>deploy phase</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

多个goals按配置的先后顺序运行。executions用来对goals进行配置,也可以添加id进行标识。

实际的配置会复杂许多,可以参考开源项目:

https://github.com/metersphere/metersphere

https://github.com/macrozheng/mall

小结

本文介绍了Maven内置的三个生命周期,生命周期是由多个阶段组成,IntelliJ IDEA集成了所有没有短横线命名的这些可以直接执行的阶段。阶段是由阶段目标(Plugin Goals)构成的,在pom.xml中进行配置。pom.xml是Maven一个很重要很常用的文件。

参考资料:

https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

https://www.runoob.com/maven/maven-build-life-cycle.html

跟着官方文档学Maven构建生命周期的更多相关文章

  1. Maven 构建生命周期

    构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列.这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准备资源 资源复制 资源复制可 ...

  2. Maven学习(十三)-----Maven 构建生命周期

    Maven 构建生命周期 构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列. 这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准 ...

  3. Java-Maven-Runoob:Maven构建生命周期

    ylbtech-Java-Maven-Runoob:Maven构建生命周期 1.返回顶部 1. Maven 构建生命周期 Maven 构建生命周期定义了一个项目构建跟发布的过程. 一个典型的 Mave ...

  4. maven 学习---Maven构建生命周期

    构建生命周期是一组阶段的序列(sequence of phases),每个阶段定义了目标被执行的顺序.这里的阶段是生命周期的一部分. 举例说明,一个典型的 Maven 构建生命周期是由以下几个阶段的序 ...

  5. Maven - 构建生命周期、阶段、目标

    版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...

  6. 【第四篇】- Maven 构建生命周期之Spring Cloud直播商城 b2b2c电子商务技术总结

    ​ ​ Maven 构建生命周期 Maven 构建生命周期定义了一个项目构建跟发布的过程. 一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的: ​ 阶段 处理 描述 验证 ...

  7. 002-Apache Maven 构建生命周期

    Maven - 构建生命周期 什么是构建生命周期 构建生命周期是一组阶段的序列(sequence of phases),每个阶段定义了目标被执行的顺序.这里的阶段是生命周期的一部分. 举例说明,一个典 ...

  8. Maven构建生命周期

    以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命 ...

  9. 4、maven——构建生命周期

    什么是生命周期? 构建生命周期是一组阶段的序列(sequence of phase),每个阶段定义了目标被执行的顺序,这里的阶段就是生命周期的一部分. 一个典型的Maven生命周期由一些几个阶段的序列 ...

随机推荐

  1. Python数模笔记-NetworkX(3)条件最短路径

    1.带有条件约束的最短路径问题 最短路径问题是图论中求两个顶点之间的最短路径问题,通常是求最短加权路径. 条件最短路径,指带有约束条件.限制条件的最短路径.例如,顶点约束,包括必经点或禁止点的限制:边 ...

  2. ES6学习-3 const

    const声明一个只读的常量.一旦声明,常量的值就不能改变,所以在声名时就进行赋值. const的作用域与let命令相同,只在声明所在的块级作用域内有效. const命令声明的常量,同样存在暂时性死区 ...

  3. 怎么用优启通安装win7 !!!!好好好20191020

    怎么用优启通安装win7 PE技术探索在国内属于前沿梯队.相关PE工具更新的非常及时,两个月一更新,很赞. 尤其是论坛代表作之一:EasyImageX系统备份恢复镜像工具(集成在PE里面),可以说是用 ...

  4. 强哥HTML学习笔记

    html 浏览器的选择:1.火狐2.ie3.chrome4.mac5.opera 安装两款插件:1.firebug2.web develope html页面元素:1.doctype2.htmlhead ...

  5. 014.Ansible Playbook Role 及调试

    一 role 简介 在ansible中,role是将playbook分割为多个文件的主要机制,大大简化了复杂的playbook的编写,同时已与复用 role各个目录的作用及可用文件 files:存放由 ...

  6. Linux_日志管理理论概述

    一.日志系统 1.kernel -->物理终端(/dev/console) --> /var/log/dmesg(系统启动时信息(包括错误信息)记录到该文件) 或者:# dmesg 或 # ...

  7. Linux_进程管理相关命令

    一.进程管理命令 1.ps -- 进程查看命令 1️⃣:ps(process state)命令用于列出当前的进程 2️⃣:可以显示详细的进程信息,包括: 用户识别符(UID),它确定进程的特权 唯一进 ...

  8. yum 命令详解-yum仓库配置文件详解

    yum安装的优点 1.必须得有网络,通过网络获取软件. 2.管理rpm包 3.自动解决依耐 4.命令简单好用 5.生产最佳实践 yum命令详解 # linux安装软件的三种方式 1.rpm安装 2.源 ...

  9. STM32 SWD下载口无法下载的原因和解决办法

    1.SWD的下载口在程序中被禁用,IO口被设置为普通IO口 2.芯片被锁,原因有可能是程序执行了不正确的访问导致芯片被锁 3.供电不正常 4.SWD烧了 解锁原因: 在下载程序的时候有时候会发生错误导 ...

  10. HEX与ASCII之间装换

    static const char bcd_ascll[20]={0x30,0x31,0x32,0x33,0x34, 0x35,0x36,0x37,0x38,0x39,                 ...