跳至主要內容

Maven生命周期详解

holic-x...大约 10 分钟PMmaven

Maven生命周期详解

Maven配置基础

1.用户属性Properties的使用

构件引用的常见方式

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.2.1.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.2.1.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.2.1.RELEASE</version>
  </dependency>
</dependencies>

抽离公共属性

​ 上面的构件引用的groupId、version都是一样的,面对重复的配置可以将抽离成公共的变量值,然后供全局引用

<!-- 公共属性定义 -->
<properties>
  <spring.group>org.springframework</spring.group>
  <spring.version>5.2.1.RELEASE</spring.version>
</properties>

<!-- 构件引入 -->
<dependencies>
  <dependency>
    <groupId>${spring.group}</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>${spring.group}</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>${spring.group}</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring.version}</version>
  </dependency>
</dependencies>

Maven生命周期

​ 开发一个项目的时候,通常有这些环节:创建项目、编写代码、清理已编译的代码、编译代码、执行单元测试、打包、集成测试、验证、部署、生成站点等,这些环节组成了项目的生命周期,这些过程也叫做项目的构建过程,几乎所有的项目都由这些环节构成。其中创建项目和编写代码是程序员需要多参与的,其他的都可以做成自动化的方式。

​ 思考ant应用,在maven出现前,开发人员每天都在对项目进行清理、编译、执行单元测试、打包、部署等操作,虽然大家都在做这些工作,但是没有一个统一的标准,项目和项目之间,公司和公司之间,大多数都是各写各的,写法是千奇百怪,能满足自身需求就可以了,但是换个项目就得从头再来,这些操作又需要重新编写脚本。

​ 而maven出来之后,项目生命周期中的这些环节都被简化了,被规范化了,maven出现之前,项目的结构没有一个统一的标准,所以生命周期中各个环节对应的自动化脚本也是各种各样,而maven约定好了项目的结构,源码的位置、资源文件的位置、测试代码的位置、测试用到的资源文件的位置、静态资源的位置、打包之后文件的位置等,这些都是maven约定好的,

​ 清理代码:mvn clean,不需要配置清理的目标目录;

​ 编译代码:mvn compile ,完成编译的操作;

​ 运行测试用例: mvn test ,自动运行测试用例;

​ 打包项目:mvn package,将项目打包为 jar、war 格式的包

1.Maven中定义的3套生命周期

生命周期目标说明
clean Lifecycle清理项目在进行真正的构建之前进行一些清理工作
default Lifecycle构建项目构建的核心部分,编译,测试,打包,部署等等
site Lifecycle生成项目站点生成项目报告,站点,发布站点

​ 上面这3套生命周期是相互独立的,没有依赖关系,而每套生命周期中有多个阶段,每套中的多个阶段是有先后顺序的,并且后面的阶段依赖于前面的阶段,而用户可以直接使用 mvn 命令来调用这些阶段去完成项目生命周期中具体的操作

clean

clean生命周期的目的是清理项目,它包含三个阶段:

生命周期阶段描述
pre-clean执行一些需要在clean之前完成的工作
clean移除所有上一次构建生成的文件
post-clean执行一些需要在clean之后立刻完成的工作

​ 每个生命周期中的后面的阶段会依赖于前面的阶段,当执行某个阶段的时候,会先执行其前面的阶段。通过mvn指令执行上述操作

default

​ Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。

​ 关注核心:compile (编译)test-compile(编译测试源码)test(测试)package(打包)install(安装)deploy (部署)

事件说明
validate (校验)校验项目是否正确并且所有必要的信息可以完成项目的构建过程
initialize(初始化)初始化构建状态(例如设置属性值)
generate-sources (生成源代码)生成包含在编译阶段中的任何源代码
process-sources (处理源代码)处理源代码(例如过滤任意值)
generate-resources (生成资源文件)生成将会包含在项目包中的资源文件
process-resources (处理资源文件)复制并处理资源文件,至目标目录,准备打包
compile (编译)编译项目的源代码
process-classes (处理类文件)处理编译生成的文件(例如对Java class文件做字节码改善优化)
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(安装)将包安装至本地仓库,以让其它项目依赖
deploy (部署)将最终的包复制到远程的仓库,以让其它开发人员与项目共享

​ 对于default生命周期,每个事件在执行之前都会将之前的所有事件依次执行一遍

​ 运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要

site

​ site生命周期的目的是建立和发布项目站点,Maven能够基于pom.xml所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。主要包含以下4个阶段:

site生命周期说明
pre-site执行一些需要在生成站点文档之前完成的工作
site生成项目的站点文档
post-site执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy将生成的站点文档部署到特定的服务器上

​ 可以在pom.xml中配置site站点信息,随后通过通过site生成站点信息

2.Maven命令和生命周期

​ 从命令行执行maven任务的最主要方式就是调用maven生命周期的阶段,需要注意的是,每套生命周期是相互独立的,但是每套生命周期中阶段是有前后依赖关系的,执行某个的时候,会按序先执行其前面所有的

​ mvn执行阶段的命令格式是:

mvn 阶段1 [阶段2] [阶段3]
#多个阶段的名称用空格间隔

常用指令使用:

  • mvn clean
  • mvn test
  • mvn clean install
  • mvn clean deploy

Maven的标准目录结构

目录目的
$存放pom.xml和所有的子目录
${basedir}/src/main/java项目的java源代码
${basedir}/src/main/resources项目的资源,比如说property文件,springmvc.xml
${basedir}/src/test/java项目的测试类,比如说Junit代码
${basedir}/src/test/resources测试用的资源
${basedir}/src/main/webapp/WEB-INFweb应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面
${basedir}/target打包输出目录
${basedir}/target/classes编译输出目录
${basedir}/target/test-classes测试编译输出目录
Test.javaMaven只会自动运行符合该命名规则的测试类
~/.m2/repositoryMaven默认的本地仓库目录位置

借助Maven指令理解Maven生命周期

创建一个User.java,依次执行指令,查看具体效果

​ mvn clean:删除了target文件夹内容

image-20240425142559875

​ mvn compile:编译,生成了target文件夹并相关类编译成class文件

image-20240425142704190

​ mvn clean pakage:这个指令执行,会先执行其前面多个生命周期,随后在target文件夹生成一个jar(对应版本打包的jar),至于target其他内容的生成是因为执行了前面的生命周期,每个生命周期都会做点什么,最终构建一个完整的执行效果

image-20240425143058315

mvn clean install:该指令执行,以此类推,会先执行前面的生命周期(对比mvn clean package,其多了一步Installing步骤,会将前面在target生成的jar导入到本地昂库),可以在本地仓库根据构件坐标去定位内容

image-20240425143500134

image-20240425143802833

​ 基于上述几个常用指令,结合mvn指令和对应执行效果去理解Maven的生命周期,从而对比每个指令的不同

Maven插件

Maven插件基本概念

​ maven插件主要是为maven中生命周期中的阶段服务的,maven中只是定义了3套生命周期,以及每套生命周期中有哪些阶段,具体每个阶段中执行什么操作,完全是交给插件去干的。

​ maven中的插件就相当于一些工具,比如编译代码的工具,运行测试用例的工具,打包代码的工具,将代码上传到本地仓库的工具,将代码部署到远程仓库的工具等等,这些都是maven中的插件。

​ 插件可以通过 mvn 命令的方式调用直接运行,或者将插件和maven生命周期的阶段进行绑定,然后通过 mvn 阶段 的方式执行阶段的时候,会自动执行和这些阶段绑定的插件。

Maven插件目标

​ maven中的插件以jar的方式存在于仓库中,和其他构件是一样的,也是通过坐标进行访问,每个插件中可能为了代码可以重用,一个插件可能包含了多个功能,比如编译代码的插件,可以编译源代码、也可以编译测试代码;

​ 插件中的每个功能就叫做插件的目标(Plugin Goal),每个插件中可能包含一个或者多个插件目标(Plugin Goal)

​ 目标参数:插件目标是用来执行任务的,那么执行任务肯定是有参数配的,这些就是目标的参数,每个插件目标对应于java中的一个类,参数就对应于这个类中的属性

# 列出所有的插件目标
mvn 插件goupId:插件artifactId[:插件version]:help
mvn 插件前缀:help
  • 执行指令:mvn org.apache.maven.plugins:maven-clean-plugin:help

image-20240425144506611

# 查看插件目标参数列表
mvn 插件goupId:插件artifactId[:插件version]:help -Dgoal=目标名称 -Ddetail
mvn 插件前缀:help -Dgoal=目标名称 -Ddetail
  • 执行指令:mvn org.apache.maven.plugins:maven-clean-plugin:help -Dgoal=help -Detail:列出clean插件的help目标的详细参数信息

image-20240425144654262

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3