跟着官方文档学Maven构建生命周期
在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进行标识。
实际的配置会复杂许多,可以参考开源项目:
小结
本文介绍了Maven内置的三个生命周期,生命周期是由多个阶段组成,IntelliJ IDEA集成了所有没有短横线命名的这些可以直接执行的阶段。阶段是由阶段目标(Plugin Goals)构成的,在pom.xml中进行配置。pom.xml是Maven一个很重要很常用的文件。
参考资料:
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
跟着官方文档学Maven构建生命周期的更多相关文章
- Maven 构建生命周期
构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列.这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准备资源 资源复制 资源复制可 ...
- Maven学习(十三)-----Maven 构建生命周期
Maven 构建生命周期 构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列. 这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准 ...
- Java-Maven-Runoob:Maven构建生命周期
ylbtech-Java-Maven-Runoob:Maven构建生命周期 1.返回顶部 1. Maven 构建生命周期 Maven 构建生命周期定义了一个项目构建跟发布的过程. 一个典型的 Mave ...
- maven 学习---Maven构建生命周期
构建生命周期是一组阶段的序列(sequence of phases),每个阶段定义了目标被执行的顺序.这里的阶段是生命周期的一部分. 举例说明,一个典型的 Maven 构建生命周期是由以下几个阶段的序 ...
- Maven - 构建生命周期、阶段、目标
版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...
- 【第四篇】- Maven 构建生命周期之Spring Cloud直播商城 b2b2c电子商务技术总结
Maven 构建生命周期 Maven 构建生命周期定义了一个项目构建跟发布的过程. 一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的: 阶段 处理 描述 验证 ...
- 002-Apache Maven 构建生命周期
Maven - 构建生命周期 什么是构建生命周期 构建生命周期是一组阶段的序列(sequence of phases),每个阶段定义了目标被执行的顺序.这里的阶段是生命周期的一部分. 举例说明,一个典 ...
- Maven构建生命周期
以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命 ...
- 4、maven——构建生命周期
什么是生命周期? 构建生命周期是一组阶段的序列(sequence of phase),每个阶段定义了目标被执行的顺序,这里的阶段就是生命周期的一部分. 一个典型的Maven生命周期由一些几个阶段的序列 ...
随机推荐
- C++PRIMER第二章前半部分答案
C++PRIMER第二章前半部分答案 哈哈哈,为什么是前半部分呢,后半部分还在学习中,重新系统性的学习c++,共同进步嘛,不多说,跟我一起来看看吧,第三章开始才是新手收割的时候,慢慢来~~ 2.1&a ...
- spring-第三章-jdbc
一,回顾 aop:面向切面编程,就是将一些和主业务流程没有关系的公共代码,提取封装到切面类,通过切入点规则,可以对目标方法进行功能增强;也就是可以再目标方法执行的前后添加一段额外逻辑代码; 二,Jdb ...
- [bug] MySQL-Front连接MySQL 8.0失败
原因: MySQL-Front不支持MySQL 8.0的密码认证方式 解决: 在mysql安装目录中my.ini文件末尾添加 default_authentication_plugin=mysql_n ...
- [转载]层叠与并排win10
三. 层叠与并排 如果要排列的窗口超过4个,分屏就显得有些不够用了,这时不妨试一试最传统的窗口排列法.具体方法是,右击任务栏空白处,然后选择"层叠窗口"."并排显示窗口& ...
- 源码安装Python3
源码安装Python3 一.安装Python3需要的依赖包 [root@localhost ~]# yum install -y gcc make wget openssl openssl-devel ...
- gpcj-07.为什么是连锁零售类公司
1.量化分析的真面目 本课的目的: ·理解零售类公司价值分析的逻辑·学会量化分析公司的思路和原理前言的前沿 和大部分投资者不同,我们的投资核心之一,就是从下而上的分析.宏观经济对我们公司分析影响极少. ...
- ShardingSphere你还不会吗?(第一篇)
ShardingSphere你还不会吗?(第一篇) 作者:星晴(当地小有名气,小到只有自己知道的杰伦粉) 一.需求 我们做项目的时候,数据量比较大,单表千万级别的,需要分库分表,于是在网上搜索这方面的 ...
- 信息学C++教程<-3->输入输出格式控制
二进制输出整数 在计算机系统内的数据本身就是二进制 思考:在C++中,如何通过cout函数来输出二进制的数字呢? 所需库文件:1.iomanip //管理C++格式控制 2.bitset //二进 ...
- 在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! <Spring 手撸专栏>目录 [x] 第 1 章:开篇介绍,我要带你撸 Spri ...
- nmap扫描端口导致线上大量Java服务FullGC甚至OOM
nmap扫描端口导致线上大量Java服务FullGC甚至OOM 最近公司遇到了一次诡异的线上FullGC保障,多个服务几乎所有的实例集中报FullGC,个别实例甚至出现了OOM,直接被docker杀掉 ...