Advertisement

Maven笔记 - 第六章

阅读量:

第6篇:生命周期和插件详解

maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。

这是maven系列第6篇。

整个 Maven 系列内容之间存在依存关系

前面我们使用maven过程中,用到了一些命令,如下:

复制代码
    mvn clean
    mvn compile
    mvn test
    mvn package
    mvn install
    mvn install -Dmaven.test.skip=true
    mvn deploy
    mvn help:system

上面这些命令如果你玩过maven应该都不会陌生但你有没有想过这些命令背后的设计逻辑为什么-Dmaven.test.skip=true能够跳过测试而无需修改其他地方的设置这就是本文将深入探讨的内容希望本文能为你带来一些新的见解废话不多说我们开始吧

以上这些命令如果你玩过Maven大概都是家常便饭但你是否想过这些命令背后的运行机制为什么-Dmaven.test.skip=true能够跳过测试而无需修改其他地方的配置这就是我们今天要深入探讨的核心知识点希望本文能为你带来更清晰的理解

本文主要内容

用户自定义属性的使用

maven生命周期详解

maven插件详解

用户属性Properties的使用

项目pom.xml中,有下面这样一段依赖:

复制代码
    
        org.springframework
        spring-core
        5.2.1.RELEASE
    
    
        org.springframework
        spring-beans
        5.2.1.RELEASE
    
    
        org.springframework
        spring-aop
        5.2.1.RELEASE

大家看一下上面的配置,有没有什么问题?

两者具有相同的groupId和version。程序员应处理冗余的代码。对于Java项目而言,在开发过程中我们可以通过将相同的代码块或变量值抽象为方法或字段来实现复用效果。

那么maven的pom.xml中也支持这么做:

复制代码
    org.springframework
    5.2.1.RELEASE
    
    
    
    
        ${spring.group}
        spring-core
        ${spring.version}
    
    
        ${spring.group}
        spring-beans
        ${spring.version}
    
    
        ${spring.group}
        spring-aop
        ${spring.version}

请查看上方的代码,在pom.xml文件中存在一个名为properties的部分作为其直接子元素出现,并包含自定义的一些用户属性字段;随后在其他地方引用时可以采用 ${属性名称}的方式进行引用

生命周期

进行项目开发时,主要涉及的步骤包括:首先创建新项目;随后进行代码编写;接着处理已编译文件;之后执行编译操作;再者安排单元测试;随后打包成可执行文件;之后进行集成测试;接着通过验证确认无误后;最后完成部署并生成网站等。这些步骤构成了整个项目的运行流程框架,在实际应用中大多数项目都依赖于其中的一些步骤。作为核心任务,创建和编写代码是程序员必须参与的重点工作;而其余部分则可以通过自动化来完成。

那些熟悉ant的人可能会回想,在maven出现之前(...)开发人员每天进行清理(clear)、编译(compile)、执行单元测试(run tests)、打包(package)以及部署(deploy)等操作。尽管所有人在执行这些任务时都在做一些相同的工作(tasks),但缺乏统一的标准导致各个项目的实现方式千差万别:有些公司内部会有统一的做法;而另一些公司则会根据个人习惯随意发挥;还有些团队甚至会采用完全不同的实现方式(approach)。这种状况使得当更换项目时需要重新开始整个流程成为必须面对的事实

一旦引入Maven后

maven中生命周期详解

Maven将项目的生命周期定义为三种不同的生命周期,并将其划分为多个子阶段。在每种周期中具体涵盖哪些子周期是Maven已经预先规定了的;而对于每个子周期的具体执行内容,则可以根据需求自行设置。

maven中定义的3套生命周期:

clean生命周期

default生命周期

site生命周期

这三套周期表彼此独立运行且互不干扰,在项目管理中各具特色。每个周期表内部包含多个工作流程,并且各个工作流程之间存在执行顺序。后续的工作流程必须在前一阶段完成后才能启动。开发人员可以通过运行mvn命令来触发各个工作流程以完成项目的整体管理流程。

复制代码
    mvn 生命周期阶段

通俗点解释:

maven将项目的3个关键生命周期划分为3个类别范围内的操作。
每一个类别下包含了一系列特定的操作步骤。
这些操作步骤即代表各个具体的阶段。
每个操作步骤都有一个明确的阶段标识。
各个类别内的操作步骤存在先后顺序。
在执行某一个操作步骤时,
具体该步骤所需完成的内容则由插件机制进行参数配置,
从而实现了极大的灵活性。

用户执行mvn 阶段名称就相当于调用了具体的某个方法。

让我们深入了解各周期中的具体阶段是什么。这些阶段相当于我们在各类中所探讨的具体方法是什么及其排列组合是怎样的。

clean生命周期

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

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

用户可以通过命令mvn pre-clean来启动clean生命周期中的pre-clean阶段并执行其相关操作。

当调用mvn post-clean时,它会依次启动上述三个操作。在Maven生命周期中后续的阶段通常会在前一阶段完成后才会运行,在启动某个特定操作时,默认情况下该操作会在其前一个阶段完成后立即启动。

default生命周期

这个是maven主要的生命周期,主要被用于构建应用,包含了23个阶段。

生命周期阶段 描述
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 测试:使用合适的单元测试框架运行测试(Juint是其中之一)。
prepare-package 准备打包:在实际打包之前,执行任何的必要的操作为打包做准备。
package 打包:将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
pre-integration-test 集成测试前:在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
integration-test 集成测试:处理和部署项目到可以运行集成测试环境中。
post-integration-test 集成测试后:在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。
verify 验证:运行任意的检查来验证项目包有效且达到质量标准。
install 安装:安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
deploy 部署:将最终的项目包复制到远程仓库中与其他开发者和项目共享。

site生命周期

该平台旨在建立并发布项目网站,Maven可根据pom.xml中的信息自动生成一个友好的网站,便于团队协作与传播项目信息。其主要涵盖以下四个阶段:

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

mvn命令和生命周期

通过命令行工具使用maven时的主要步骤是启动并管理其内部工作流程。需要注意的是每个周期之间彼此独立运行但又必须满足特定顺序要求。在处理某个周期时会依次先完成所有前置任务以确保系统的有序运作。

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

复制代码
    mvn 阶段1 [阶段2] [阶段n]

多个阶段的名称之间用空格隔开。

下面我们举一些常见的例子来说明一下:

mvn clean

该命令是执行 clean 周期的 clean 阶段这一过程, 所包含的阶段为预清洁阶段和 clean 阶段。

mvn test

该命令将默认周期内的test阶段纳入处理流程。具体来说,默认周期将从第一个子阶段(validate)开始处理代码直至进入(test)阶段为止。其中涉及代码编译以及测试案例的实际执行过程。

mvn clean install

在该命令中包含了两个主要操作:首先是从提供的三个生命周期及其相关阶段列表进行查询,并根据结果定位到特定周期下的具体操作步骤;随后将依次执行预处理流程直至完成主处理流程,并在整个过程中完成相应的操作步骤

其中包含清除上一次构建成果的操作步骤:首先进行代码的编译操作;随后运行测试用例以验证功能是否正常;接着生成打包文件并将其复制至本地存储库。

mvn clean deploy

在开发流程中,这一指令也具有一定的频率。它首先会在clean生命周期内依次处理所有属于[pre-clean,clean]区间的阶段,在执行该命令时,首先会依次处理属于clean生命周期内的所有阶段。随后会按照顺序处理属于default生命周期的所有阶段(即上述提到的[validate,deploy]区间内的各个步骤)。该指令的主要操作包括清除上一轮构建的产物、完成代码编译工作、运行单元测试程序以及打包生成最终可执行文件;之后会将这些完成好的文件复制至本地仓库并上传至远程服务器进行发布

上面说了这么多理论,我们来看一下效果。

案例

创建一个maven项目

打开idea,点击File->New->Project,选择Maven,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jOFJ3ziq-1629908611082)(media/3407681c505b7360a6afb7c051ba6eb8.png)]

点击Next,输入项目坐标信息,如下:

该平台在外链上传图片时可能存在防盗链保护措施,请您考虑将该图片先本地保存后再进行上传操作,并确保使用正确的链接格式为:(media/[媒体路径])

点击Next,输入Project name 为maven-chat06,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TBYeFHAY-1629908611090)(media/913ffb93a110020702bc11015c152f38.png)]

点击Finish,创建成功,如下:

外链图片无法正常保存至指定位置, 可能由于目标站点设置了防止图片被断开访问的机制, 请尝试将图片文件保存到本地后再进行上传操作

配置一下idea的maven环境,点击File->Settings,如下图:

外部链接中的图片无法正常存取,请注意可能是由于目标服务器端存在防盗链设置导致的问题。建议将图片保存后重新上传至该平台以解决存取问题

点击上面的OK完成配置。

还原~/.m2/settings.xml的配置到初始状态,操作如下:

复制代码
    将M2_HOME/conf/settings.xml复制到~/.m2/settings.xml目录,如果存在先备份一个,然后进行覆盖。

基于maven配置的项目遵循约定原则,并且其组织架构遵循maven规定的标准模式;针对maven项目的架构特点,请允许我们再次复习相关内容。

Maven 建议采用一个统一的标准目录架构。Maven 遵循约定优于配置的原则是 Maven 的原则。项目参与者被鼓励遵循这一标准目录架构来组织他们的构建活动。如需进一步了解,请参考相关文档。

目录 目的
${basedir} 存放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默认的本地仓库目录位置

借助刚才项目的结构和这个表格深入理解一下吧!让我们深入了解从项目的开始到持续运行再到逐步优化的过程中各个阶段所产生的具体影响。

修改pom.xml,如下:

复制代码
     version="1.0" encoding="UTF-8"
     xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    4.0.0
    
    com.javacode2018
    maven-chat06
    1.0-SNAPSHOT
    jar
    
        UTF-8
        
        1.8
        
        1.8
        
        1.8
    
    
    
        
            junit
            junit
            4.12
            test

上面properties这个元素中的配置,可能大家看不懂,先略过,后面会详解。

创建一个Demo类,源码是放在src/main/java目录中,如下:

复制代码
     com.javacode2018.maven;
    
     java.util.ArrayList;
     java.util.List;
    
      Demo1 {
     static void main(String[] args) {
        System.out.println("欢迎和【马士兵老师】一起学习maven,带你成为maven高手!");
        List<Integer> list =  ArrayList<>();
         (int i = 0; i < 5; i++) {
            list.add(i);
        }
        list.forEach(System.out::print);
    }
    }
mvn clean命令效果

在当前项目pom.xml所在目录中执行下面命令:

复制代码
    mvn clean

效果如下:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn clean
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (-clean) @ maven-chat06 ---
    [INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.477 s
    [INFO] Finished at: 2019-11-15T18:46:13+08:00
    [INFO] ------------------------------------------------------------------------

在上文中提到编译与打包的操作均放置于特定路径下,在查看输出时发现有一个命令是用于删除该路径下的目标文件夹(记为target/),这表明使用mvn clean命令会清除该目标文件夹中的所有内容目前状态为空的状态。

mvn compile命令效果

先看一下项目的目录中是没有target目录的,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TO0dIS8f-1629908611099)(media/8bf17e3266f80d3fed0cc9a6f02691cd.png)]

cmd中执行:

复制代码
    mvn compile

输出:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn compile
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (-resources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ maven-chat06 ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  1.897 s
    [INFO] Finished at: 2019-11-15T18:53:12+08:00
    [INFO] ------------------------------------------------------------------------

在项目管理界面中可以看到,在源代码编辑器中输入相应的代码片段后点击运行按钮即可进行编译。系统会将该操作用于编译Demo.java文件并将其放置于target/classes目录中。为了更好地了解整个项目的构建流程,请参考下图所示的项目层次结构图。

上图中匡红的是新生成的。

mvn clean package效果
复制代码
    D:\code\IdeaProjects\maven-chat06>mvn clean package
    [INFO] Scanning for projects...
    [INFO]
    [INFO] ------------------- com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-chat06 ---
    [INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-chat06 ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-chat06 ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-chat06 ---
    [INFO]
    [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ maven-chat06 ---
    [INFO] Building jar: D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT.jar
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.177 s
    [INFO] Finished at: 2019-11-15T18:56:59+08:00
    [INFO] ------------------------------------------------------------------------

从输出结果来看,在查看日志时发现有某个操作(如Building jar ...)运行后生成了一个JAR文件。如果查看项目配置文件(pom.xml),发现其中packaging字段未指定,默认取值为jar格式,则表示该操作构建的结果是一个JAR文件。使用命令mvn clean package执行后会首先清除未编译的源代码(clean),随后经历默认生命周期中的compile阶段,并将构建结果打包成JAR文件放置于目标目录位置(如./target),如图所示:

此图无法存取,请检查源站防盗链设置

观察到上面还有一些额外的结果后,请大家暂时不考虑这些信息,在阅读完本文后能够理解其主要内容。

mvn clean install效果
复制代码
    D:\code\IdeaProjects\maven-chat06>mvn clean install
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (-clean) @ maven-chat06 ---
    [INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (-resources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ maven-chat06 ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:testResources (-testResources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:testCompile (-testCompile) @ maven-chat06 ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (-test) @ maven-chat06 ---
    [INFO]
    [INFO] --- maven-jar-plugin:2.4:jar (-jar) @ maven-chat06 ---
    [INFO] Building jar: D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT.jar
    [INFO]
    [INFO] --- maven-install-plugin:2.4:install (-install) @ maven-chat06 ---
    [INFO] Installing D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat06\1.0-SNAPSHOT\maven-chat06-1.0-SNAPSHOT.jar
    [INFO] Installing D:\code\IdeaProjects\maven-chat06\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat06\1.0-SNAPSHOT\maven-chat06-1.0-SNAPSHOT.pom
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.977 s
    [INFO] Finished at: 2019-11-15T19:05:21+08:00
    [INFO] ------------------------------------------------------------------------

mvn clean package运行后的结果进行比较分析,在输出信息上有所增加,在细节描述上增添了两条关于Installing...的指令。具体而言,在执行操作后得到了更多的输出信息,并且特别新增了两条关于如何将项目构建为JAR文件以及相关的POM文件并存放在本地仓库的操作记录。这些操作也意味着将组件打包部署到本地仓库中。

这些mvn指令的操作实例都是通过预先设定好的生命周期阶段来实现的,并且实现了外部看来十分复杂的一系列操作。例如打包过程, 其实包含了多个内部处理环节, 而maven为我们隐藏了许多繁琐细节, 最终只需运行一个简洁明了的mvn package指令即可轻松完成整个流程。

上面也有说过,每个阶段具体做的事情是由maven插件来完成的。

当我们回顾上文的一个输出时

注意以下所有命令都在cmd窗口执行,执行位置位于上面这个项目的pom.xml所在目录。

请特别关注所有命令,在cmd窗口中执行。

Maven插件

maven插件主要负责为Maven中的各个生命周期阶段提供支持。其中,Maven仅设置了三套核心的生命周期体系,并详细列出了每一套周期内的具体阶段,这些周期内的具体操作完全由相应的插件来执行。

maven中的组件类似于一组功能模块,它们包括构建代码的功能、执行测试用例的能力、整合开发成果的作用以及向本地版本控制系统上传代码的作用和向远程版本控制系统推送项目到远程仓库的功能等;这些都是maven功能库中的组件。

插件可以通过 mvn 命令使用特定途径即时运行;或者将插件与 Maven 生命周期的阶段实现绑定;当使用 mvn 阶段时,则会自动执行与这些阶段相关联的插件。

插件目标

在Maven仓库中存在以jar形式表示的插件,在与其他组件具有相同的特性的同时也能够通过坐标定位实现访问。每个插件内部可能包含代码重用模块,在满足特定需求的前提下能够实现代码重用。每一个具体的实现单元都对应着一个独立的功能模块,在该单元内部可能会包含多个互相关联的功能组件。例如,在处理源代码方面不仅支持源码以及测试文件的编译操作还能够完成相关的调试功能。其中每个功能被定义为插件的目标(Plugin Goal),一个插件最多可配置一个或多个目标(Plugin Goal)。

目标参数

插件的功能是用来负责实现特定功能的,并且实现特定功能通常依赖于相应的输入参数。这些输入参数就是该功能所需的属性信息,并且每个插件的功能都映射到Java中对应的一个类及其属性。

列出插件所有目标
复制代码
    mvn 插件goupId:插件artifactId[:插件version]:help
    mvn 插件前缀:help

上面插件前缀的先略过,我们先看第一种效果。

如:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-clean-plugin:help
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:help (default-cli) @ maven-chat06 ---
    [INFO] org.apache.maven.plugins:maven-clean-plugin:2.5
    
    Maven Clean Plugin
      The Maven Clean Plugin is a plugin that removes files generated at build-time
      in a project's directory.
    
    This plugin has 2 goals:
    
    clean:clean
      Goal which cleans the build.
      This attempts to clean a project's working directory of the files that were
      generated at build-time. By default, it discovers and deletes the directories
      configured in project.build.directory, project.build.outputDirectory,
      project.build.testOutputDirectory, and project.reporting.outputDirectory.
    
      Files outside the default may also be included in the deletion by configuring
      the filesets tag.
    
    clean:help
      Display help information on maven-clean-plugin.
      Call
    mvn clean:help -Ddetail=true -Dgoal=<goal-name>
      to display parameter details.

上文详细介绍了maven-clean-plugin这一插件的所有功能与操作方式。该插件共有两个主要功能项:分别为maven-clean``和``maven-clean-help。这些功能项通过使用分号进行区分与组合来实现不同的操作需求。每一个功能项后都有详细的说明内容来进一步阐述其具体作用机制。

查看插件目标参数列表
复制代码
    mvn 插件goupId:插件artifactId[:插件version]:help -Dgoal=目标名称 -Ddetail
    mvn 插件前缀:help -Dgoal=目标名称 -Ddetail

在上述命令中使用-Ddetail时,默认会获取详细的目标参数列表信息;如果缺少这一项,则该参数将不被生成并可自由决定是否显示。

如:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-clean-plugin:help -Dgoal=help -Ddetail
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:help (default-cli) @ maven-chat06 ---
    [INFO] org.apache.maven.plugins:maven-clean-plugin:2.5
    
    Maven Clean Plugin
      The Maven Clean Plugin is a plugin that removes files generated at build-time
      in a project's directory.
    
    clean:help
      Display help information on maven-clean-plugin.
      Call
    mvn clean:help -Ddetail=true -Dgoal=<goal-name>
      to display parameter details.
    
      Available parameters:
    
    detail (Default: false)
      If true, display all settable properties for each goal.
      Expression: ${detail}
    
    goal
      The name of the goal for which to show help. If unspecified, all goals
      will be displayed.
      Expression: ${goal}
    
    indentSize (Default: 2)
      The number of spaces per indentation level, should be positive.
      Expression: ${indentSize}
    
    lineLength (Default: 80)
      The maximum length of a display line, should be positive.
      Expression: ${lineLength}

上面列出了clean插件的help目标的详细参数信息。

在详细参数说明中存在类似格式的变量表示方法。这些变量通常用于传递给该运行目标的配置值。具体来说,在技术文档或命令行配置中会看到类似格式:例如 Expression: ${xxx} 表示一个表达式引用某个动态生成的内容。需要注意的是,在某些情况下该 ${xxx} 与目标运行的实际配置项名称可能不匹配。因此,在使用这些预定义变量时应格外谨慎。建议在编写带特定配置项的目标时先进行测试并观察其运行效果如何。

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-clean-plugin:help -Dgoal=help -Ddetail=false
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:help (default-cli) @ maven-chat06 ---
    [INFO] org.apache.maven.plugins:maven-clean-plugin:2.5
    
    Maven Clean Plugin
      The Maven Clean Plugin is a plugin that removes files generated at build-time
      in a project's directory.
    
    clean:help
      Display help information on maven-clean-plugin.
      Call
    mvn clean:help -Ddetail=true -Dgoal=<goal-name>
      to display parameter details.
    
    
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.332 s
    [INFO] Finished at: 2019-11-18T15:14:56+08:00
    [INFO] ------------------------------------------------------------------------

上面传了一个detail=false,上面未输出目标的详细参数信息。

命令行运行插件
复制代码
    mvn 插件goupId:插件artifactId[:插件version]:插件目标 [-D目标参数1] [-D目标参数2] [-D目标参数n]
    mvn 插件前缀:插件目标  [-D目标参数1] [-D目标参数2] [-D目标参数n]

案例:

maven中运行测试用例使用到的插件坐标是:

复制代码
    <dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12.4</version>
    </dependency>

我们看一下这个插件有哪些目标:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin:help
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:help (default-cli) @ maven-chat06 ---
    [INFO] Maven Surefire Plugin 2.12.4
      Surefire is a test framework project.
    
    This plugin has 2 goals:
    
    surefire:help
      Display help information on maven-surefire-plugin.
      Call mvn surefire:help -Ddetail=true -Dgoal=<goal-name> to display parameter
      details.
    
    surefire:test
      Run tests using Surefire.
    
    
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.662 s
    [INFO] Finished at: 2019-11-18T15:26:26+08:00
    [INFO] ------------------------------------------------------------------------

maven-surefire-plugin插件包含两个主要目标help和`test$。通过描述可以看出其功能是执行测试用例。

我们看一下test目标对应的参数列表:

test目标对应的参数太多,我们只列出了部分参数,如下:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin:help -Dgoal=test -Ddetail=true
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:help (default-cli) @ maven-chat06 ---
    [INFO] Maven Surefire Plugin 2.12.4
      Surefire is a test framework project.
    
    surefire:test
      Run tests using Surefire.
    
      Available parameters:
    
    skip (Default: false)
      Set this to 'true' to bypass unit tests entirely. Its use is NOT
      RECOMMENDED, especially if you enable it using the 'maven.test.skip'
      property, because maven.test.skip disables both running the tests and
      compiling the tests. Consider using the skipTests parameter instead.

请各位仔细阅读关于skip参数的说明内容。
其默认设置为false。
当设置为true时,
项目将跳过编译步骤以及执行测试用例的过程,
可通过配置maven.test.skip属性来实现,
使其能够跳过相应的操作。
需要注意的是,
通过-D选项指定的参数名与目标属性名不一致时,
因此需要注意的是-D选项后面的字段名称可能与目标属性名不匹配。

我们来运行一下test目标看看效果。

先看一下不加参数的效果:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin:test
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (-cli) @ maven-chat06 ---
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.640 s
    [INFO] Finished at: 2019-11-18T15:33:48+08:00
    [INFO] ------------------------------------------------------------------------

maven.skip.test=true的效果如下:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin:test -Dmaven.test.skip=
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (-cli) @ maven-chat06 ---
    [INFO] Tests are skipped.
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.652 s
    [INFO] Finished at: 2019-11-18T15:34:45+08:00
    [INFO] ------------------------------------------------------------------------

对比一下上面2个输出,下面的多了一行如下:

复制代码
    [INFO] Tests are skipped.

说明跳过了测试的执行。

插件传参的2种方式

之前介绍了一种通过-D选项后跟用户的属性来传递参数的方法;另外一种方法是在pom.xml文件中的properties部分设置用户的自定义属性。

修改项目maven-chat06的pom.xml,properties中加入:

复制代码
    <maven.test.skip></maven.test.skip>

cmd中运行:

复制代码
    mvn org.apache.maven.plugins:maven-surefire-plugin:test

效果如下:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin:test
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (-cli) @ maven-chat06 ---
    [INFO] Tests are skipped.
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.638 s
    [INFO] Finished at: 2019-11-18T15:46:04+08:00
    [INFO] ------------------------------------------------------------------------

输出中也有Tests are not executed. ,表明跳过了测试,并与-Dmaven.test.skip=true的效果表现相同。

之前提到的是关于插件功能的具体实现内容。那么问题来了:插件功能是如何与整个应用的生命周期相衔接起来的呢?接下来继续深入探讨这个问题。

获取插件目标详细描述信息的另外一种方式
复制代码
    mvn help:describe -Dplugin=插件goupId:插件artifactId[:插件version] -Dgoal=目标名称 -Ddetail
    mvn help:describe -Dplugin=插件前缀 -Dgoal=目标名称 -Ddetail

上面这个命令使用了help插件中的describe目标。该目标具备列出其他指定插件目标详细信息的能力。

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn help:describe -Dplugin=org.apache.maven.plugins:maven-surefire-plugin -Dgoal=test -Ddetail
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-help-plugin:3.2.0:describe (default-cli) @ maven-chat06 ---
    [INFO] Mojo: 'surefire:test'
    surefire:test
      Description: Run tests using Surefire.
      Implementation: org.apache.maven.plugin.surefire.SurefirePlugin
      Language: java
      Bound to phase: test
    
      Available parameters:
    
    additionalClasspathElements
      Additional elements to be appended to the classpath.
    
    argLine
      User property: argLine
      Arbitrary JVM options to set on the command line.
    
    skip (Default: false)
      User property: maven.test.skip
      Set this to 'true' to bypass unit tests entirely. Its use is NOT
      RECOMMENDED, especially if you enable it using the 'maven.test.skip'
      property, because maven.test.skip disables both running the tests and
      compiling the tests. Consider using the skipTests parameter instead.

这种方法可以与上一种方法进行对比;相较于上一种方法而言更为详细;在参数说明中新增一行内容:属性名称可以通过以下两种途径实现传递:

mvn命令-D属性名称的方式传递

pom.xml中properties中定义的方式指定。

开发者普遍了解-Maven.test.skip命令为何能跳过构建测试代码的过程以及执行单元测试的过程。

插件前缀

当启动一个maven项目时

可以通过下面命令查看到插件的前缀:

复制代码
    mvn help:describe -Dplugin=插件goupId:插件artifactId[:插件version]

示例效果:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn help:describe -Dplugin=org.apache.maven.plugins:maven-surefire-plugin
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-help-plugin:3.2.0:describe (default-cli) @ maven-chat06 ---
    [INFO] org.apache.maven.plugins:maven-surefire-plugin:2.12.4
    
    Name: Maven Surefire Plugin
    Description: Surefire is a test framework project.
    Group Id: org.apache.maven.plugins
    Artifact Id: maven-surefire-plugin
    Version: 2.12.4
    Goal Prefix: surefire

输出中的Goal Prefix:部分对应的就是插件的前缀,上面这个插件的前缀是surefire

我们使用前缀来运行一下插件感受一下效果:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn surefire:test
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (default-cli) @ maven-chat06 ---
    [INFO] Tests are skipped.
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.934 s
    [INFO] Finished at: 2019-11-18T16:18:42+08:00
    [INFO] ------------------------------------------------------------------------

该插件的test目标借助于别名实现了对maven-surefire-plugin的执行。

在操作过程中频繁地使用了该命令。这一行为利用了该Maven插件的功能模块。其中help作为前缀标识了该功能模块的作用位置,并且其坐标位置为:

复制代码
    org.apache.maven.plugins
    maven-help-plugin
    3.2.0

插件和生命周期阶段绑定

maven仅制定了项目的各个阶段划分,并未对各个阶段的具体执行方式作出规定;这些具体操作是由特定的插件组件来完成的;因此必须确保项目各阶段与其相关的插件组件之间建立关联关系;每个项目周期内的各个独立阶段都能够同时管理多套不同插件组件的目标工作

当我们在项目生命周期中将各个阶段与其相关的插件目标建立关联时,在运行**mvn 阶段**命令后即可实现与这些阶段相关联的插件操作。

maven内置插件以及绑定

为了不需要进行任何配置即可完成某些项目构建操作,maven提供了一个便捷的解决方案。例如,运行mvn clean可以帮助我们清理代码,而运行mvn install则可以将构件安装到本地仓库。因此,maven为我们提供了便利,它内部预装了很多默认插件功能,通过将一些构建阶段与这些插件集成在一起,无需进行任何额外配置即可完成清理代码、编译程序、执行测试用例以及打包部署至本地仓库,并上传至远程服务器的任务。这是因为maven已经为我们设置好了相应的插件目标,使得所有这些操作可以直接执行,无需人工干预。现在让我们来探索一下maven内置了哪些这样的便捷功能。

maven内置绑定

clean生命周期阶段与插件绑定关系
生命周期阶段 插件:目标
pre-clean
clean maven-clean-plugin:clean
post-clean

在Maven项目的构建周期中,默认情况下只有在"clean"阶段才会绑定"maven-clean-plugin"插件到"clean"目标上。

该插件的功能则主要用于清除项目生成的最终输出目录。

default生命周期阶段与插件绑定关系

该default周期包含23个环节,在其中仅具备默认绑定的部分被列出;其余未被列出的部分不具备任何插件配置,默认情况下将导致没有任何实际的行为发生。

生命周期阶段 插件:目标 执行任务
process-resources maven-resources-plugin:resources 复制主资源文件至主输出目录
compile maven-compiler-plugin:compile 编译主代码至主输出目录
process-test-resources maven-resources-plugin:testResources 复制测试资源文件至测试输出目录
test-compile maven-compiler-plugin:testCompile 编译测试代码至测试输出目录
test maven-surefile-plugin:test 执行测试用例
package maven-jar-plugin:jar 创建项目jar包
install maven-install-plugin:install 将输出构件安装到本地仓库
deploy maven-deploy-plugin:deploy 将输出的构件部署到远程仓库
site生命周期阶段与插件绑定关系
生命周期阶段 插件:目标
pre-site
site maven-site-plugin:site
post-site
site-deploy maven-site-plugin:deploy

来几个案例解说一下。

mvn clean

此命令旨在调用清洁周期的所有阶段中的"清理"步骤。实际上涉及的是清洁周期中的预清理过程以及随后的主要清理步骤。为了确定具体的插件配置,请参考上文中的绑定信息表可知,在上文中提供的绑定表中可以看到只有"clean"阶段绑定了maven-clean-plugin插件的"clear"目标。因此,在运行mvn clean指令时会触发maven-clean-plugin插件的任务来完成代码清理工作。

运行一下看一下效果:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn clean
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-chat06 ---
    [INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.408 s
    [INFO] Finished at: 2019-11-18T16:34:14+08:00
    [INFO] ------------------------------------------------------------------------

上面有一行输出如下:

复制代码
    [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-chat06 ---

这个表示调用的插件是:maven-clean-plugin,版本是:2.5,插件的目标是:clean

mvn test

该命令会在default生命周期中执行test阶段,在线学习平台的安全性评估中,默认情况下是安全且稳定的。实际操作是从default生命周期的第一个阶段(即validate阶段)开始执行一直到test阶段结束,在线学习平台的安全性评估中,默认情况下是安全且稳定的。其中涵盖了代码的编译以及运行测试案例的过程,并且这个流程与之前提到的方法完全一致,在线学习平台的安全性评估中,默认情况下是安全且稳定的。同样的逻辑适用于之前的分析步骤,请参考上表中的关联信息,在线学习平台的安全性评估中,默认情况下是安全且稳定的。通过这种方式可以明确得知mvn test指令会触发一系列插件的目标:

复制代码
    maven-resources-plugin:resources
    maven-compiler-plugin:compile
    maven-resources-plugin:testResources
    maven-compiler-plugin:testCompile
    maven-surefile-plugin:test

我们来验证一下,看看是不是和我们分析的一样:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn test
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (-resources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ maven-chat06 ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:testResources (-testResources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:testCompile (-testCompile) @ maven-chat06 ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\test-classes
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (-test) @ maven-chat06 ---
    [INFO] Tests are skipped.
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  1.880 s
    [INFO] Finished at: 2019-11-18T16:36:55+08:00
    [INFO] ------------------------------------------------------------------------

从上面输出中可以看到调用了5个插件的目标,和分析的一样。

再来看一个跳过测试的例子,如下:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn test -Dmaven.skip.test=true
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven-chat06 ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ maven-chat06 ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ maven-chat06 ---
    [INFO] Tests are skipped.
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  1.384 s
    [INFO] Finished at: 2019-11-18T16:38:52+08:00
    [INFO] ------------------------------------------------------------------------

这个是不是很熟悉呢?经常用到的跳过测试是什么?这样写的理由是什么呢?我想大家都知道了吧。

其他一些常见的命令包括mvn compilemvn installmvn deploy。请各位读者可以尝试实践使用这些命令,并通过不断练习来提升技能。

自定义绑定

除了现有的默认绑定操作外,在某些情况下我们还可以根据需求将特定阶段与插件目标进行绑定以完成特定功能 通过这种自定义绑定机制可以使maven项目在构建过程中能够实现更为多样的功能

通常情况下,在配置项目时会遇到以下情况:首先需要构建项目的源码JAR包并将其部署到仓库中;由于内置插件之间的绑定关系并未涵盖此步骤的任务,默认情况下不会自动处理;因此,在配置过程中需要手动进行相应的设置。

插件maven-source-plugin中的jar-no-fork组件有助于实现这一目标。我们将此目标绑定至default生命周期中verify阶段,在测试结束后并执行构件部署至本地仓库之前的步骤中进行处理。在此过程中我们需要生成源代码,并按照以下方式设置相关参数:

maven-chat06中的pom.xml加入如下配置:

复制代码
    
        
            org.apache.maven.plugins
            maven-source-plugin
            3.2.0
            
                
                
                    
                    attach-source
                    
                    
                        jar-no-fork
                    
                    
                    verify

注意上面配置的attach-source,后面输出中会有。

id:任务的id,需唯一,如果不指定,默认为default

每个插件的配置在pom.xml的plugins元素中只能写一次,否则会有警告。

最终pom.xml如下:

复制代码
     version="1.0" encoding="UTF-8"
     xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    4.0.0
    
    com.javacode2018
    maven-chat06
    1.0-SNAPSHOT
    jar
    
        UTF-8
        
        1.8
        
        1.8
        
        1.8
    
    
    
        
            junit
            junit
            4.12
            test
        
    
    
    
        
            
                org.apache.maven.plugins
                maven-source-plugin
                3.2.0
                
                    
                    
                        
                        attach-source
                        
                        
                            jar-no-fork
                        
                        
                        verify

运行下面命令:

复制代码
    mvn install

效果:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn install
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (-resources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ maven-chat06 ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:testResources (-testResources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:testCompile (-testCompile) @ maven-chat06 ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (-test) @ maven-chat06 ---
    [INFO]
    [INFO] --- maven-jar-plugin:2.4:jar (-jar) @ maven-chat06 ---
    [INFO]
    [INFO] --- maven-source-plugin:3.2.0:jar-no-fork (attach-source) @ maven-chat06 ---
    [INFO]
    [INFO] --- maven-install-plugin:2.4:install (-install) @ maven-chat06 ---
    [INFO] Installing D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat06\1.0-SNAPSHOT\maven-chat06-1.0-SNAPSHOT.jar
    [INFO] Installing D:\code\IdeaProjects\maven-chat06\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat06\1.0-SNAPSHOT\maven-chat06-1.0-SNAPSHOT.pom
    [INFO] Installing D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT-sources.jar to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat06\1.0-SNAPSHOT\maven-chat06-1.0-SNAPSHOT-sources.jar
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.268 s
    [INFO] Finished at: 2019-11-18T16:59:12+08:00
    [INFO] ------------------------------------------------------------------------

上面有个输出如下:

复制代码
    maven-source-plugin:3.2.0:jar-no-fork (attach-source) @ maven-chat06 ---

可以看到,在配置插件生成源码jar的过程中,默认会触发一些功能模块的运行。其中,在括号中的attach-source参数处设置的值实际上是位于pom.xml文件中所指定的任务id标识符。

最后有个输出:

复制代码
    [INFO] Installing D:\code\IdeaProjects\maven-chat06\target\maven-chat06-1.0-SNAPSHOT-sources.jar to C:\Users\Think\.m2\repository\com\javacode2018\maven-chat06\1.0-SNAPSHOT\maven-chat06-1.0-SNAPSHOT-sources.jar

可以看到将源码安装到本地仓库了。

某些插件的功能通常会与特定的生命周期阶段相关联;特别地,在这种情况下(即当插件的目标属性与已配置的内容完全匹配时),无需使用phase元素即可实现关联;如何获取插件的目标属性及其对应的关联阶段设置?

复制代码
    mvn help:describe -Dplugin=插件goupId:插件artifactId[:插件version] -Dgoal=目标名称 -Ddetail
    mvn help:describe -Dplugin=插件前缀 -Dgoal=目标名称 -Ddetail

我们看一下插件sourcejar-no-fork目标默认的绑定:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn help:describe -Dplugin=source -Dgoal=jar-no-fork -Ddetail
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-help-plugin:3.2.0:describe (-cli) @ maven-chat06 ---
    [INFO] Mojo: 'source:jar-no-fork'
    source:jar-no-fork
      Description: This goal bundles all the sources into a jar archive. This
    goal functions the same as the jar goal but does not fork the build and is
    suitable  attaching to the build lifecycle.
      Implementation: org.apache.maven.plugins.source.SourceJarNoForkMojo
      Language: java
      Bound to phase:

在输出结果中存在一个代码块Bound to phase: package,意味着该配置项默认地绑定于包级别上的phase阶段。

已知现有系统中存在三种独立运行时配置(即3套生命周期),但它们内部各处理阶段之间存在严格的执行顺序——即启动特定处理流程时必须先完成所有前置流程的任务。在清除旧版本代码的过程中采用的方法是基于\texttt{clean}周期中的\texttt{clean}阶段,在构建新版本项目采用的技术是基于\texttt{default}周期中的\texttt{compile}阶段。\par
如果仅执行\texttt{mvn compile}命令来构建项目,则不会触发清除旧代码的过程——只有当发现修改过的文件数量较多时才会继续处理。\par
为了确保在每次构建新版本项目前都已完成旧版本清理工作,请考虑采取以下措施:

复制代码
    mvn clean compile

上面的写法是不是很熟悉,运行一下看看效果:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn clean compile
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (-clean) @ maven-chat06 ---
    [INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (-resources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ maven-chat06 ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  1.666 s
    [INFO] Finished at: 2019-11-18T17:16:53+08:00
    [INFO] ------------------------------------------------------------------------

还有其他方式么?

最近我们在学习自定义绑定技术。在项目生命周期的默认阶段进行验证操作以清理代码插件。接下来让我们利用自定义绑定功能实现这一目标,在'project->build->plugins'元素中加入下面配置:

复制代码
    org.apache.maven.plugins
    maven-clean-plugin
    2.5
    
        
        
            
            clean-target
            
                clean
            
            
            validate

运行下面命令看效果:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn compile
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (clean-target) @ maven-chat06 ---
    [INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (-resources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ maven-chat06 ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  1.630 s
    [INFO] Finished at: 2019-11-18T17:22:37+08:00
    [INFO] ------------------------------------------------------------------------

输出中有:

复制代码
    [INFO] --- maven-clean-plugin:2.5:clean (clean-target) @ maven-chat06 ---
    [INFO] Deleting D:\code\IdeaProjects\maven-chat06\target

这个功能实现了代码清理功能的执行。执行了代码清理操作后的感觉是使用起来非常方便,并且无需每次都手动输入clean命令。

POM.xml插件配置详解

插件目标共享参数配置

build->plugins->plugin中配置:

复制代码
    
    目标参数名>参数值/目标参数名>

configuration节点中设置目标参数的值,并指定该参数的名称;通过这种方式实现的一种设置将在当前插件的所有目标上生效;因此,在当前插件中所有目标将共享此参数设置。

案例:

将案例中的pom.xml中的build元素修改成下面这样。

复制代码
    
        
            org.apache.maven.plugins
            maven-surefire-plugin
            2.12.4
            
            
                true

运行下面命令,看效果:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn test
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (-resources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ maven-chat06 ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:testResources (-testResources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:testCompile (-testCompile) @ maven-chat06 ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (-test) @ maven-chat06 ---
    [INFO] Tests are skipped.
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  1.328 s
    [INFO] Finished at: 2019-11-18T17:30:58+08:00
    [INFO] ------------------------------------------------------------------------

可以看出Test被跳过了,表明跳过了测试有三种方法:

复制代码
 mvn -Dmaven.test.skip=tue
    2. properties中配置<maven.test.skip></maven.test.skip>
    3. build中配置插件参数的方式

这一种配置参数设置对当前插件的所有目标全部适用;如需针对特定的目标进行配置,则采用下面所述的方式。

插件目标参数配置

用于project->build->plugins->plugin->executions->execution元素的配置设置具体说明如下:

复制代码
    
    目标参数名>参数值/目标参数名>

上面这种配置常用于自定义插件绑定,只对当前任务有效。

感受一下效果,将pom.xml中的build元素改为下面内容:

复制代码
    
        
            org.apache.maven.plugins
            maven-surefire-plugin
            2.12.4
            
                
                    
                        test
                        help
                    
                    pre-clean
                    
                    
                        true

在clean周期内的pre-clear阶段为插件maven-surefire-plugin注册了两个目标test和help,默认情况下execution元素未指定id字段为空(即默认值为default)。

运行下面命令,见效果:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn pre-clean
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:test (default) @ maven-chat06 ---
    [INFO] Tests are skipped.
    [INFO]
    [INFO] --- maven-surefire-plugin:2.12.4:help (default) @ maven-chat06 ---
    [INFO] Maven Surefire Plugin 2.12.4
      Surefire is a test framework project.
    
    This plugin has 2 goals:
    
    surefire:help
      Display help information on maven-surefire-plugin.
      Call mvn surefire:help -Ddetail=true -Dgoal=<goal-name> to display parameter
      details.
    
    surefire:test
      Run tests using Surefire.
    
    
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.738 s
    [INFO] Finished at: 2019-11-18T17:41:08+08:00
    [INFO] ------------------------------------------------------------------------

可以看到上面输出中运行了插件的两个目标,和预期结果一致。

获取maven插件信息

上面我们介绍了,可以通过下面命令获取插件目标详细介绍信息

复制代码
    mvn help:describe -Dplugin=插件goupId:插件artifactId[:插件version] -Dgoal=目标名称 -Ddetail
    mvn help:describe -Dplugin=插件前缀 -Dgoal=目标名称 -Ddetail

大量maven插件的使用指南可以在maven的官方网站上访问到,请查阅详细内容。如果需要了解更多信息,请访问网站查看详细说明。

复制代码
    http:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YrlCbfOx-1629908611107)(media/36507818631d24797370e5a024a53f8f.png)]

插件解析机制

为了便于用户进行插件的安装与配置, Maven无需用户提供完整的插件坐标信息, 即可顺利解析到相应的插件. 不过我认为, 在进行插件配置时最好是先准备好完整的坐标信息. 否则会使得新手在理解配置以及排查问题时感到困惑.

插件仓库

与现有的其他Maven组件相似,在Maven仓库中按照坐标组织存放的插件组件也遵循坐标存储原则存放在Maven仓库中。当需要使用时,Maven会在本地位置搜索插件,如果本地位置没有找到,则转向远程仓库进行查询,找到后下载至本地仓库存放以便之后就可以方便地使用.

请回想一下,在之前的章节里提到过,在pom.xml文件中我们可以设置依赖项构件的存储位置。

复制代码
    
        maven-nexus
        http://localhost:8081/repository/maven-public/
        
            true
        
        
            true

然而,在具体实现中存在一些不同之处;具体来说;插件系统是在pluginRepositories->pluginRepository元素中进行配置设置。

复制代码
    
        myplugin-repository
        http://repo1.maven.org/maven2/
        
            true

查看前两段配置信息时发现,在repository中设置的配置参数与位于其子项中的pluginRepository中的对应设置完全一致

插件的默认groupId

在pom.xml中配置插件的时候,如果是官方的插件,可以省略groupId

案例:

修改本篇示例中的pom.xml,如下:

复制代码
     version="1.0" encoding="UTF-8"
     xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    4.0.0
    
    com.javacode2018
    maven-chat06
    1.0-SNAPSHOT
    jar
    
    
        UTF-8
    
    
    
        
            
                maven-compiler-plugin
                3.1
                
                    1.8
                    1.8
                    1.8

在项目中使用了maven-compiler-plugin工具。
该插件用于代码编译。
它是由maven官方提供的。
我们跳过了groupId字段。

该插件主要用于编译代码,在进行编译操作时需要明确配置使用的编译器版本、源代码的版本以及目标代码的版本参数,并将这些设置均为1.8。

值得回顾的是,在代码开始部分的properties属性中存在几个配置项设置为1.8的比例,默认情况下这些值会通过插件中的特定参数来获取。为了更详细地了解这些默认设置是如何被获取的,请参考该插件中定义的compile目标的具体参数说明。

运行下面命令:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn clean compile
    [INFO] Scanning  projects...
    [INFO]
    [INFO] -------------------< com.javacode2018:maven-chat06 >--------------------
    [INFO] Building maven-chat06 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (-clean) @ maven-chat06 ---
    [INFO] Deleting D:\code\IdeaProjects\maven-chat06\target
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (-resources) @ maven-chat06 ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 0 resource
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ maven-chat06 ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat06\target\classes
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  1.692 s
    [INFO] Finished at: 2019-11-18T18:11:34+08:00
    [INFO] ------------------------------------------------------------------------

可以看到可以正常运行。

上面pom.xml省略了插件的groupId配置,如下:

复制代码
    org.apache.maven.plugins

maven在解析该插件的过程中会自动生成官方预设的groupId因此能够顺利运行但不推荐大家采用这种方式可能会使新手感到困惑

插件前缀的解析

之前已经提到,在使用mvn命令调用插件时可以通过插件的前缀来替代繁琐的插件坐标的方式。那么maven又是如何通过这些前缀来找到对应的插件位置信息呢?

每个插件都有唯一的前缀标识符与groupId:artifactId配对关系

复制代码
    ~/.m2/repository/org/apache/maven/plugins/maven-metadata-central.xml
    ~/.m2/repository/org/codehaus/mojo/maven-metadata-central.xml

接几个图,大家感受一下:

外链图片无法正常显示,可能因目标网站存在防采集或缓存机制,请确保将文件保存后再重新上传

外部链接中的图片无法正常访问...可能由于防盗链设置导致无法加载,请您将图片保存后重新尝试上传

也可以在settings.xml文件中设置参数,以指示Maven在检查插件元数据时关注其他groupId中的前缀以及插件之间的依赖关系。

复制代码
      
    com.your.plugins

pluginGroups中存在多个pluginGroup实例,在配置时可以选择适合自己插件的元数据所属groupId,并通过指定前缀路径实现访问管理功能;这里暂时不做详细讲解,请待后续文章中详细讨论自定义插件的相关设置。

查看项目最终pom.xml文件

我们的项目pOM文件默认继承了一个顶级Maven父项目的POM配置文件;其中包含了多个预设化的设置内容;例如,在构建过程中涉及的不同阶段以及与多个插件进行绑定设置的部分;如果想要查看这些设置内容,请问它们具体存储在哪里?

mvn命令在项目中执行的时候,我们的pom.xml和父类的pom.xml最终会进行合并,当我们的pom.xml写的比较复杂的时候,最终合并之后是什么效果呢,我们可以通过下面这个命令查看:

复制代码
    mvn help:effective-pom

效果:

复制代码
    D:\code\IdeaProjects\maven-chat06>mvn help:effective-pom > 1.xml

上面我们执行了命令以获取其运算后的结果,并将其输出至项目1.xml文件中;随后我们查看一下项目1.xml的内容:

复制代码
     version="1.0" encoding="GBK"
    
    
    
    
    
    
    
    
    
    
    
    
     xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    4.0.0
    com.javacode2018
    maven-chat06
    1.0-SNAPSHOT
    
        UTF-8
    
    
        
            
                false
            
            central
            Central Repository
            https://repo.maven.apache.org/maven2
        
    
    
        
            
                never
            
            
                false
            
            central
            Central Repository
            https://repo.maven.apache.org/maven2
        
    
    
        D:\code\IdeaProjects\maven-chat06\src\main\java
        D:\code\IdeaProjects\maven-chat06\src\main\scripts
        D:\code\IdeaProjects\maven-chat06\src\test\java
        D:\code\IdeaProjects\maven-chat06\target\classes
        D:\code\IdeaProjects\maven-chat06\target\test-classes
        
            
                D:\code\IdeaProjects\maven-chat06\src\main\resources
            
        
        
            
                D:\code\IdeaProjects\maven-chat06\src\test\resources
            
        
        D:\code\IdeaProjects\maven-chat06\target
        maven-chat06-1.0-SNAPSHOT
        
            
                
                    maven-antrun-plugin
                    1.3
                
                
                    maven-assembly-plugin
                    2.2-beta-5
                
                
                    maven-dependency-plugin
                    2.8
                
                
                    maven-release-plugin
                    2.5.3
                
            
        
        
            
                maven-compiler-plugin
                3.1
                
                    
                        default-compile
                        compile
                        
                            compile
                        
                        
                            1.8
                            1.8
                            1.8
                        
                    
                    
                        default-testCompile
                        test-compile
                        
                            testCompile
                        
                        
                            1.8
                            1.8
                            1.8
                        
                    
                
                
                    1.8
                    1.8
                    1.8
                
            
            
                maven-clean-plugin
                2.5
                
                    
                        default-clean
                        clean
                        
                            clean
                        
                    
                
            
            
                maven-resources-plugin
                2.6
                
                    
                        default-testResources
                        process-test-resources
                        
                            testResources
                        
                    
                    
                        default-resources
                        process-resources
                        
                            resources
                        
                    
                
            
            
                maven-jar-plugin
                2.4
                
                    
                        default-jar
                        package
                        
                            jar
                        
                    
                
            
            
                maven-surefire-plugin
                2.12.4
                
                    
                        default-test
                        test
                        
                            test
                        
                    
                
            
            
                maven-install-plugin
                2.4
                
                    
                        default-install
                        install
                        
                            install
                        
                    
                
            
            
                maven-deploy-plugin
                2.7
                
                    
                        default-deploy
                        deploy
                        
                            deploy
                        
                    
                
            
            
                maven-site-plugin
                3.3
                
                    
                        default-site
                        site
                        
                            site
                        
                        
                            D:\code\IdeaProjects\maven-chat06\target\site
                            
                                
                                    org.apache.maven.plugins
                                    maven-project-info-reports-plugin
                                
                            
                        
                    
                    
                        default-deploy
                        site-deploy
                        
                            deploy
                        
                        
                            D:\code\IdeaProjects\maven-chat06\target\site
                            
                                
                                    org.apache.maven.plugins
                                    maven-project-info-reports-plugin
                                
                            
                        
                    
                
                
                    D:\code\IdeaProjects\maven-chat06\target\site
                    
                        
                            org.apache.maven.plugins
                            maven-project-info-reports-plugin
                        
                    
                
            
        
    
    
        D:\code\IdeaProjects\maven-chat06\target\site

此份文件需要特别注意,请各位务必认真反复阅读几次,并深入理解其中的丰富细节内容。再三强调的是此份文件的价值所在。

课后题

留给大家2个问题

  1. 下面这个配置是干什么的?给哪个插件使用的?
复制代码
    UTF-8

mvn test执行测试用例的过程中,默认情况下测试用例类名是遵循一定的命名规范的。您是否了解这些命名规则?能否查阅相关文档或资源来获取详细说明?此外,在某些特殊需求下是否能进行个性化设置?如果有不同的需求该怎么办?

大家可以留言或者在技术群讨论。

总结

本文内容量较大,请建议大家反复阅读以深入了解相关内容;若有收获,请您分享您的感悟与见解;您的支持是我持续创作的重要动力;期待大家都能有所收获!

Maven系列目录

Maven系列:第1篇:Maven未出世前,我们那些痛苦的经历!

Maven系列第2篇:安装、配置、mvn运行过程详解

Maven系列第3篇:详解maven解决依赖问题

Maven系列第4篇:仓库详解

Maven系列第5篇:私服详解

复制代码
                            org.apache.maven.plugins

                            maven-project-info-reports-plugin
                        
                    
                
            
            
                default-deploy
                site-deploy
                
                    deploy
                
                
                    D:\code\IdeaProjects\maven-chat06\target\site
                    
                        
                            org.apache.maven.plugins
                            maven-project-info-reports-plugin
                        
                    
                
            
        
        
            D:\code\IdeaProjects\maven-chat06\target\site
            
                
                    org.apache.maven.plugins
                    maven-project-info-reports-plugin
                
            
        
    
    
    
    
    D:\code\IdeaProjects\maven-chat06\target\site
复制代码
    >   上面这个文件,大家一定要认真多看几遍,理解一下,里面包含太多东西,再重复一下,上面的文件多看几遍!多看几遍!多看几遍!要理解!
    
    ## 课后题
    
    留给大家2个问题
    
    1.  下面这个配置是干什么的?给哪个插件使用的?
复制代码
    UTF-8
复制代码
  `mvn
    test`运行测试用例的时候,测试用例类名的写法默认是有规则的,这些规则有人知道么?从哪里可以看到这些规则?如何自定义?
    
    大家可以留言或者在技术群讨论。
    
    ## 总结
    
    **本文内容比较多,希望大家多读几遍,要理解。如果有收获的帮忙分享一下,你们的支持也是我不断输出的一个动力,希望大家都能够学到东西!**
    
    ## Maven系列目录
    
    1.  Maven系列:第1篇:Maven未出世前,我们那些痛苦的经历!
    
    2.  Maven系列第2篇:安装、配置、mvn运行过程详解
    
    3.  Maven系列第3篇:详解maven解决依赖问题
    
    4.  Maven系列第4篇:仓库详解
    
    5.  Maven系列第5篇:私服详解

全部评论 (0)

还没有任何评论哟~