04_生命周期和插件

4/29/2021 maven

# 一、前言

除了坐标、依赖以及仓库之外,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
1

参数-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>
1
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>
1
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.获取插件

当需要插件时,可以访问如下网址获取

https://maven.apache.org/plugins/ (opens new window)

# 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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

远程插件仓库的节点含义与远程仓库的节点含义相同。

上次更新: 2021-05-13 14:50:04