04_生命周期和插件
# 一、前言
除了坐标、依赖以及仓库之外,Maven 另外两个核心概念是生命周期和插件。
生命周期是抽象,插件是其具体实现。
# 二、生命周期
Maven 的生命周期就是对所有的构建过程进行抽象和统一,包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。
Maven 的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在 Maven 的设计中,实际的任务(如编译源代码)都交由插件来完成。这种思想与设计模式中的模板方法(TemplateMethod)非常相似。
每个构建步骤都可以绑定一个或者多个插件行为,而且 Maven 为大多数构建步骤编写并绑定了默认插件。例如,针对编译的插件有 maven-compiler-plugin,针对测试的插件有 maven-surefire-plugin 等。
# 1.三套生命周期
maven 有三套生命周期:clean、 default、site
三套生命周期相互独立,每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,
# 1.1 clean
清理项目
它包含三个阶段:
1)pre-clean 执行一些清理前需要完成的工作。
2)clean 清理上一次构建生成的文件。
3)post-clean 执行一些清理后需要完成的工作。
# 1.2 default
定义了项目构建时所需要执行的所有步骤
这里只列出比较重要的阶段:
process-sources:处理项目主资源文件。
一般来说,是对 src/main/resources 目录的内容进行变量替换等工作后,复制到项目输出的主 classpath 目录中。
compile:编译项目的主源码。
一般来说,是编译 src/main/java 目录下的 Java 文件至项目输出的主 classpath 目录中。
process-test-sources:处理项目测试资源文件。
一般来说,是对 src/test/resources 目录的内容进行变量替换等工作后,复制到项目输出的测试 classpath 目录中。
test-compile:编译项目的测试代码。
一般来说,是编译 src/test/java 目录下的 Java 文件至项目输出的测试 classpath 目录中
test:使用单元测试框架运行测试,测试代码不会被打包或部署。
package:接受编译好的代码,打包成可发布的格式,如 JAR。
install:将 jar 包安装到 Maven 本地仓库,供本地其他 Maven 项目使用。
deploy:将最终的包复制到远程仓库,供其他开发人员和 Maven 项目使用。
# 1.3 site
建立和发布项目站点,Maven 能够基于 POM 所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。
该生命周期包含如下阶段:
- pre-site:执行一些在生成项目站点之前需要完成的工作。
- site:生成项目站点文档。
- post-site:执行一些在生成项目站点之后需要完成的工作。
- site-deploy:将生成的项目站点发布到服务器上。
# 2.常用命令行命令
- mvn clean install : 清理项目,然后安装 jar 包到 maven 本地仓库
- mvn test : 执行测试
- mvn clean deploy : 清理项目,然后发布 jar 包到远程仓库
# 三、插件
# 1.插件目标
Maven 的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的构件形式存在。
一个插件可以完成多个任务,而这每一个任务就是一个插件目标。
例如,maven-dependency-plugin 有许多插件目标:dependency:analyze、dependency:tree 和 dependency:list。
冒号前面是插件前缀,冒号后面是插件目标。
# 2.插件绑定
Maven 生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。
# 2.1 内置绑定
为了能让用户几乎不用任何配置就能构建 Maven 项目,Maven 在核心为一些主要的生命周期阶段绑定了很多插件的目标,当用户通过命令行调用生命周期阶段的时候,对应的插件目标就会执行相应的任务。
# 2.2 自定义绑定
Maven 支持将某个插件目标绑定到生命周期的某个阶段上
# 3.插件配置
# 3.1 命令行参数
可通过命令行参数来配置插件,如:
mvn clean install -Dmaven.test.skip=true
参数-D 是 Java 自带的,其功能是通过命令行设置一个 Java 系统属性
# 3.2 POM 中插件全局配置
有些参数的值从项目创建到项目发布都不会改变,或者说很少改变,对于这种情况,在 POM 文件中一次性配置就显然比重复在命令行输入要方便。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<extdirs>${project.basedir}/lib</extdirs>
</compilerArguments>
</configuration>
</plugin>
2
3
4
5
6
7
8
9
10
11
12
通过插件
<configuration>
节点可进行插件的全局配置。全局配置的意思是在插件对应的生命周期的所有阶段都采用此配置。
# 3.3 POM 中插件任务配置
除了为插件配置全局的参数,用户还可以为某个插件任务配置特定的参数。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>ant-validate</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuraction>
<tasks>
<echo>I'm bound to validate phase.</echo>
</tasks>
</configuraction>
</execution>
<execution>
<id>ant-verify</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuraction>
<tasks>
<echo>I'm bound to verify phase.</echo>
</tasks>
</configuraction>
</execution>
</executions>
</plugin>
</plugins>
</build>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- execution:执行任务
- id : 执行任务的 id
- phase : 生命周期的特定阶段
- goal :插件目标
- configuraction :插件任务的配置
在上述配置中,配置了两个任务:ant-validate 和 ant-verify 。
ant-validate 将插件 maven-antrun-plugin 的 run 目标绑定到 maven default 生命周期的 validate 阶段上,同时配置了一个 echo 任务,向命令行输出一段文字。
# 4.获取插件
当需要插件时,可以访问如下网址获取
# 5.插件解析机制
Maven 会区别对待依赖的远程仓库与插件的远程仓库:
当 Maven 需要的依赖在本地仓库不存在时,它会去所配置的远程仓库查找
可是当 Maven 需要的插件在本地仓库不存在时,它就不会去这些远程仓库查找。
不同于 repositories 及其 repository 子元素,插件的远程仓库使用 pluginRepositories 和 pluginRepository 配置。
默认的中央插件仓库:
文件路径:apache-maven-3.5.4/lib/maven-model-builder-3.5.4.jar!/org/apache/maven/model/pom-4.0.0.xml
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
2
3
4
5
6
7
8
9
10
11
12
13
14
远程插件仓库的节点含义与远程仓库的节点含义相同。