【Maven系列2】生命周期与插件

简介: 讲解Maven的生命周期和插件,以及常用的命令。

IA20{)(FJ%{W8~K6NLTGJAQ.jpg

讲解Maven的生命周期和插件,以及常用的命令。


Maven生命周期


三套生命周期

Maven 的生命周期并不是一个整体,Maven 拥有三套相互独立的生命周期:

  • clean:项目清理的处理
  • default(或 build):项目部署的处理
  • site:项目站点文档创建的处理

三套生命周期本身是相互独立的,用户可以仅调用 clean 生命周期的某个阶段,或者仅仅调用 default 生命周期的某个阶段,而不会对其他生命周期产生任何影响。例如,当用户调用 clean 生命周期的 clean 阶段的时候,不会触发 default 生命周期的任何阶段,反之亦然。

注:所以一般的打包命令都是 clean package xxxxx,先 clean 再 package,就是因为 clean 和 package 是在两个不同的生命周期里面。


clean生命周期

当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:

  • pre-clean:执行一些需要在clean之前完成的工作
  • clean:移除所有上一次构建生成的文件
  • post-clean:执行一些需要在clean之后立刻完成的工作

当调用 pre-clean 时,只有 pre-clean 阶段得以执行;当调用 clean 的时候,pre-clean和clean阶段会得以顺序执行,以此类推。这是因为每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。

image.gif`8B2HM{`P9624D0(@9Z@}XS.png


default生命周期

重点步骤如下表,这个需要掌握:

image.gifA%YG60AH}~4][KT4TV)@OWQ.png

default的23个阶段,仅了解即可:

1}H{_56YP3D__IA]J9SO_MA.png

在开发环境中,使用下面的命令去构建、安装工程到本地仓库:

mvn install

这个命令在执行 install 阶段前,按顺序执行了 default 生命周期的阶段 (validate,compile,package,等等),我们只需要调用最后一个阶段,如这里是 install。

image.gif{2P10KOVSFSGF{__00PDUGS.png


site生命周期

  • pre-site 执行一些在生成项目站点之前需要完成的工作。
  • site 生成项目站点文档。
  • post-site 执行一些在生成项目站点之后需要完成的工作。
  • site-deploy 将生成的项目站点发布到服务器上。

这个没用过,后面如果需要用的话,我再试试。


Maven插件


插件介绍

Maven 三套生命周期定义各个阶段不做任何实际工作,实际工作都是由插件来完成的,每个生命周期阶段都是由插件的目标来完成。在 pom 文件中声明如下(打包源码文件插件):

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1.1</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来:

  • 创建 jar 文件
  • 创建 war 文件
  • 编译代码文件
  • 代码单元测试
  • 创建工程文档
  • 创建工程报告


插件目标

一个插件有可能有多个功能、每个功能就是一个目标。比如 maven-dependency-plugin 有十多个目标,每个目标对应了一个功能。插件的目标为 dependency:analyze、dependency:tree和dependency:list。通用写法:冒号前面是插件前缀,冒号后面是插件的目标。比如 compiler:compile。

AVJ{ZM4PYWST3~)QUUS7`BV.png

插件绑定


内置绑定

为实现快速构建,Maven 有一套内置的插件绑定。三套生命周期的插件绑定具体如下(其实是各个生命周期阶段与插件的目标的绑定)。其中 default 生命周期的构建方式会其打包类型有关、打包类型在POM中 packaging 指定。一般有 jar、war 两种类型。下面是默认绑定插件与生命周期关系图:

image.gifD}~DZQ7F7DXHA1YHY~)GO~3.png


自定义绑定

自定义绑定允许我们自己掌控插件目标与生命周期的结合.以生成项目主代码的源码 jar 为例。使用到的插件和它的目标为:maven-source-plugin:jar-no-fork。将其绑定到 default 生命周期阶段 verify 上(可以任意指定三套生命周期的任意阶段)。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1.1</version>
            <executions>
                <execution>
                    <id>attach-sources</id> 
                    <phase>verify</phase> <!-- 指定作用在生命周期的哪个阶段 -->
                    <goals>
                        <goal>jar-no-fork</goal> <!-- 指定执行绑定插件的哪些目标 -->
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>


举个栗子

这个是项目中的示例:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>3.0.1</version>
        <executions>
            <execution>
                <id>attach-sources</id>
                <phase>package</phase>
                <goals>
                    <goal>jar-no-fork</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <!-- 不执行单元测试 -->
            <skip>true</skip>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
            <encoding>${project.build.sourceEncoding}</encoding>
            <source>${java.version}</source>
            <target>${java.version}</target>
            <testSource>${java.version}</testSource>
            <testTarget>${java.version}</testTarget>
        </configuration>
    </plugin>
</plugins>

maven-source-plugin是对Maven工程的源码进行打jar包的插件。

但是我试过,我将它去掉,一样可以打包成功,应该是用的Maven的默认插件。

maven-surefire-plugin是maven里执行测试用例的插件,示例我们是跳过了单元测试:

HETXOQN8M$QV07QHV8}LC)C.png

maven-compiler-plugin用于指定JDK的编译版本插件,在pom.xml的属性配置文件中,我们指定的是1.8。

相关文章
|
5天前
|
Java 测试技术 Maven
|
11天前
|
Java 测试技术 Maven
|
3天前
|
Java 测试技术 Maven
|
1天前
|
Java 测试技术 Maven
|
12天前
|
Java 测试技术 Maven
|
17天前
|
Java 测试技术 Maven
Maven 插件
Maven插件是Maven的核心组件,用于实现Maven生命周期各个阶段的任务。Maven定义了三个标准生命周期:clean(清理)、default(构建)和site(生成站点文档)。每个生命周期包括多个阶段,这些阶段由不同的Maven插件实现,例如maven-clean-plugin负责执行clean阶段的清理任务。用户可以通过命令行调用特定插件的目标来执行相应的任务,如构建JAR/WAR文件、编译代码、运行单元测试等。
|
19天前
|
Java 测试技术 Maven
Maven 插件
Maven插件是Maven的核心组件,用于实现Maven生命周期各个阶段的任务。Maven定义了三个标准生命周期:clean(清理)、default(构建)和site(生成站点文档)。每个生命周期包括多个阶段,这些阶段由不同的Maven插件实现,例如maven-clean-plugin负责执行clean阶段的清理任务。用户可以通过命令行调用特定插件的目标来执行相应的任务,如构建JAR/WAR文件、编译代码、运行单元测试等。
|
21天前
|
Java 测试技术 Maven
Maven 插件
Maven通过三大生命周期:clean(清理)、default(构建)、site(站点),管理项目构建过程。每个生命周期含多个阶段,由Maven插件实现具体功能。例如,`mvn clean`调用clean生命周期的clean阶段,实际操作由maven-clean-plugin完成。Maven插件负责诸如创建JAR/WAR文件、编译代码、单元测试、文档生成等任务,可通过`mvn [plugin-name]:[goal-name]`语法执行特定目标。
|
14天前
|
Java jenkins 持续交付
jenkins学习笔记之十七:使用插件及maven上传制品到nexus
jenkins学习笔记之十七:使用插件及maven上传制品到nexus
|
15天前
|
Java 测试技术 Maven