Maven生命周期详解
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-INF | web应用文件目录,web项目的信息,比如存放web.xml、本地图片、jsp视图页面 |
${basedir}/target | 打包输出目录 |
${basedir}/target/classes | 编译输出目录 |
${basedir}/target/test-classes | 测试编译输出目录 |
Test.java | Maven只会自动运行符合该命名规则的测试类 |
~/.m2/repository | Maven默认的本地仓库目录位置 |
借助Maven指令理解Maven生命周期
创建一个User.java,依次执行指令,查看具体效果
mvn clean:删除了target文件夹内容
mvn compile:编译,生成了target文件夹并相关类编译成class文件
mvn clean pakage:这个指令执行,会先执行其前面多个生命周期,随后在target文件夹生成一个jar(对应版本打包的jar),至于target其他内容的生成是因为执行了前面的生命周期,每个生命周期都会做点什么,最终构建一个完整的执行效果
mvn clean install:该指令执行,以此类推,会先执行前面的生命周期(对比mvn clean package,其多了一步Installing步骤,会将前面在target生成的jar导入到本地昂库),可以在本地仓库根据构件坐标去定位内容
基于上述几个常用指令,结合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
# 查看插件目标参数列表
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目标的详细参数信息