掘金 后端 ( ) • 2024-04-18 09:56

theme: smartblue

常用的maven插件命令使用

    列出某插件的所有目标
    mvn org.apache.maven.plugins:maven-surefire-plugin:help
    
    查看某插件有哪些目标和这些目标对应的参数列表
    mvn org.apache.maven.plugins:maven-jar-plugin:help -Ddetail=true
    
    查看某插件的指定目标的参数列表
    mvn org.apache.maven.plugins:maven-surefire-plugin:help -Dgoal=jar -Ddetail=true
    
    获取某插件的指定目标的详细描述信息
    查看某插件的指定目标绑定到mvn生命周期的哪个阶段
    mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin -Dgoal=compile -Ddetail
    
    查看某插件的前缀(也就是缩写,比如以下插件的前缀就是surefire)
    mvn help:describe -Dplugin=org.apache.maven.plugins:maven-surefire-plugin
    
    运行surefire插件的test阶段
    mvn surefire:test

    运行clean阶段(因为clean阶段默认绑定了maven-clean-plugin:clean,且maven-clean-plugin插件的前缀是clean,所以等同于mvn clean:clean)
    mvn clean
    
    运行clean插件中的clean目标
    mvn clean:clean

    查看项目最终的pom.xml文件
    mvn help:effective-pom

mvn clean:该命令是调用clean生命周期的clean阶段,实际执行的阶段为clean生命周期中的pre-clean和clean阶段,从上面内置绑定表格中找一下,可以看到只有clean阶段绑定了maven-clean-plugin插件的clean目标,所以运行mvn clean的时候,实际上会调用maven-clean-plugin插件的clean目标来清理代码。

mvn test:该命令调用default生命周期的test阶段,实际上会从default生命周期的第一个阶段(validate)开始执行一直到test阶段结束。这里面包含了代码的编译,运行测试用例

maven生命周期

maven将项目的生命周期抽象成了3套生命周期,每套生命周期又包含多个阶段,每套中具体包含哪些阶段是maven已经约定好的,但是每个阶段具体需要做什么,是用户可以自己指定的。

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

  1. clean生命周期:清理项目,它包含3个阶段
  2. default生命周期:构建应用,包含了23个阶段
  3. site生命周期:建立和发布项目站点,包含了4个阶段

这3套生命周期是相互独立的,没有依赖关系的,而每套生命周期中有多个阶段,每套中的多个阶段是有先后顺序的,并且后面的阶段依赖于前面的阶段,而用户可以直接使用mvn命令来调用这些阶段去完成项目生命周期中具体的操作,命令是:

mvn 生命周期阶段

clean生命周期

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

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

clean周期中只有clean阶段默认绑定了maven-clean-plugin插件的clean目标。maven-clean-plugin插件的clean目标作用就是删除项目的输出目录。

mvn clean中clean指的是clean阶段。该命令是调用clean生命周期的clean阶段,实际执行的阶段为clean生命周期中的pre-clean和clean阶段,从上面内置绑定表格中找一下,可以看到只有clean阶段绑定了maven-clean-plugin插件的clean目标,所以运行mvn clean的时候,实际上会调用maven-clean-plugin插件的clean目标来清理代码

default生命周期

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

生命周期阶段 描述 插件:目标 执行任务 validate 校验:校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 initialize 初始化:初始化构建状态,比如设置属性值。 generate-sources 生成源代码:生成包含在编译阶段中的任何源代码。 process-sources 处理源代码:处理源代码,比如说,过滤任意值。 generate-resources 生成资源文件:生成将会包含在项目包中的资源文件。 process-resources 编译:复制和处理资源到目标目录,为打包阶段最好准备。 maven-resources-plugin:resources 复制主资源文件至主输出目录 compile 处理类文件:编译项目的源代码。 maven-compiler-plugin:compile 编译主代码至主输出目录 process-classes 处理类文件:处理编译生成的文件,比如说对Java class文件做字节码改善优化。 generate-test-sources 生成测试源代码:生成包含在编译阶段中的任何测试源代码。 process-test-sources 处理测试源代码:处理测试源代码,比如说,过滤任意值。 maven-resources-plugin:testResources 复制测试资源文件至测试输出目录 generate-test-resources 生成测试源文件:为测试创建资源文件。 process-test-resources 处理测试源文件:复制和处理测试资源到目标目录。 test-compile 编译测试源码:编译测试源代码到测试目标目录. maven-compiler-plugin:testCompile 编译测试代码至测试输出目录 process-test-classes 处理测试类文件:处理测试源码编译生成的文件。 test 测试:使用合适的单元测试框架运行测试(Juint是其中之一)。 maven-surefile-plugin:test 执行测试用例 prepare-package 准备打包:在实际打包之前,执行任何的必要的操作为打包做准备。 package 打包:将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 maven-jar-plugin:jar 创建项目jar包 pre-integration-test 集成测试前:在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 integration-test 集成测试:处理和部署项目到可以运行集成测试环境中。 post-integration-test 集成测试后:在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 verify 验证:运行任意的检查来验证项目包有效且达到质量标准。 install 安装:安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 maven-install-plugin:install 将输出构件安装到本地仓库 deploy 部署:将最终的项目包复制到远程仓库中与其他开发者和项目共享。 maven-deploy-plugin:deploy 将输出的构件部署到远程仓库

site生命周期

site生命周期的目的是建立和发布项目站点,Maven能够基于pom.xml所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。主要包含以下4个阶段:

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

mvn命令和生命周期

从命令行执行maven任务的最主要方式就是调用maven生命周期的阶段,需要注意的是,每套生命周期是相互独立的,但是每套生命周期中阶段是有前后依赖关系的,执行某个的时候,会按序先执行其前面所有的。

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

mvn 阶段1 [阶段2] [阶段n]

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

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

mvn clean

该命令是调用clean生命周期的clean阶段,实际执行的阶段为clean生命周期中的pre-clean和clean阶段。

mvn test

该命令调用default生命周期的test阶段,实际上会从default生命周期的第一个阶段(validate)开始执行一直到test阶段结束。这里面包含了代码的编译,运行测试用例。

mvn clean install

这个命令中执行了两个阶段:cleaninstall,从上面3个生命周期的阶段列表中找一下,可以看出clean位于clean生命周期的表格中,install位于default生命周期的表格中,所以这个命令会先从clean生命周期中的pre-clean阶段开始执行一直到clean生命周期的clean阶段;然后会继续从default生命周期的validate阶段开始执行一直到default生命周期的install阶段。

这里面包含了清理上次构建的结果,编译代码,测试,打包,将打好的包安装到本地仓库。

mvn clean deploy

这个命令也比较常用,会先按顺序执行clean生命周期的[pre-clean,clean]这个闭区间内所有的阶段,然后按序执行default生命周期的[validate,deploy]这个闭区间内的所有阶段(也就是default生命周期中的所有阶段)。这个命令内部包含了清理上次构建的结果、编译代码、运行单元测试、打包、将打好的包安装到本地仓库、将打好的包发布到私服仓库。

mvn插件和插件的目标

maven插件主要是为maven中生命周期中的阶段服务的,maven中只是定义了3套生命周期,以及每套生命周期中有哪些阶段,具体每个阶段中执行什么操作,完全是交给插件去干的。

maven中的插件就相当于一些工具,比如编译代码的工具,运行测试用例的工具,打包代码的工具,将代码上传到本地仓库的工具,将代码部署到远程仓库的工具等等,这些都是maven中的插件。

插件可以通过mvn命令的方式调用直接运行,或者将插件和maven生命周期的阶段进行绑定,然后通过mvn 阶段的方式执行阶段的时候,会自动执行和这些阶段绑定的插件。

插件目标

maven中的插件以jar的方式存在于仓库中,和其他构件是一样的,也是通过坐标进行访问,每个插件中可能为了代码可以重用,一个插件可能包含了多个功能,比如编译代码的插件,可以编译源代码、也可以编译测试代码

插件中的每个功能就叫做插件的目标(Plugin Goal),每个插件中可能包含一个或者多个插件目标(Plugin Goal)

目标参数:插件目标是用来执行任务的,那么执行任务肯定是有参数配的,这些就是目标的参数,每个插件目标对应于java中的一个类,参数就对应于这个类中的属性。

列出插件所有目标

使用以下命令可以列出插件所有目标:

mvn 插件goupId:插件artifactId[:插件version]:help
mvn 插件前缀:help

如果只看指定目标,可以在后面加上-Dgoal=目标名称

比如:mvn org.apache.maven.plugins:maven-clean-plugin:help查看所有目标

E:\WorkspaceIdea\01src\matio-maven>mvn org.apache.maven.plugins:maven-clean-plugin:help
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.matio:matio-maven >------------------------
[INFO] Building matio-maven 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:help (default-cli) @ matio-maven ---
[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.
  
[INFO] -----------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] -----------------------------------------------------------------
[INFO] Total time:  0.737 s
[INFO] Finished at: 2024-04-17T12:12:18+08:00
[INFO] -----------------------------------------------------------------

从以上输出内容中不难看出maven-clean-plugin这个插件有2个目标,分别是clean:cleanclean:help:

  • clean:clean:第一个clean是该maven-clean-plugin插件的前缀,第二个clean是目标名称
  • clean:helpclean是该maven-clean-plugin插件的前缀,help是目标名称

mvn org.apache.maven.plugins:maven-clean-plugin:help这个命令太长了,我们也可以用简写替代,上面的提到的前缀就是该插件的简写。比如mvn clean:help,注意这里的clean指的是maven-clean-plugin这个插件的前缀(也就是简写)

查看插件目标参数列表

mvn 插件goupId:插件artifactId[:插件version]:help -Dgoal=目标名称 -Ddetail
mvn 插件前缀:help -Dgoal=目标名称 -Ddetail
  • -Dgoal:查看指定目标
  • -Ddetail:输出用户输出目标详细的参数列表信息

比如:mvn org.apache.maven.plugins:maven-clean-plugin:help -Dgoal=help -Ddetail

E:\WorkspaceIdea\01src\matio-maven>mvn org.apache.maven.plugins:maven-clean-plugin:help -Dgoal=help -Ddetail
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.matio:matio-maven >------------------------
[INFO] Building matio-maven 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:help (default-cli) @ matio-maven ---
[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}


[INFO] -----------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] -----------------------------------------------------------------
[INFO] Total time:  0.291 s
[INFO] Finished at: 2024-04-17T12:23:33+08:00
[INFO] -----------------------------------------------------------------

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

注意上面参数详细参数说明中有Expression: ${xxx}这样的部分,这种表示给这个运行的目标传参,可以通过mvn -Dxxx这种方式传参,xxx${xxx}中的xxx部分,这个xxx有时候和目标参数的名称不一致,所以这点需要注意。

运行mvn org.apache.maven.plugins:maven-clean-plugin:help -Dgoal=help -Ddetail=false,因为传了一个detail=false,所以未输出目标的详细参数信息

运行插件

mvn 插件goupId:插件artifactId[:插件version]:插件目标 [-D目标参数1] [-D目标参数2] [-D目标参数n]
mvn 插件前缀:插件目标  [-D目标参数1] [-D目标参数2] [-D目标参数n]

mvn org.apache.maven.plugins:maven-surefire-plugin:help查看有哪些目标,发现有2个目标helptest,描述中可以看出test目标是用来运行测试用例的

mvn org.apache.maven.plugins:maven-surefire-plugin:help -Dgoal=test -Ddetail=true查看一下test目标有哪些参数

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这个属性来进行命令行传参,将其传递给test目标的skip属性,这个通过-D传递的参数名称就和目标参数名称不一样了,所以需要注意-D后面并不一定是参数名称。

mvn org.apache.maven.plugins:maven-surefire-plugin:test

mvn org.apache.maven.plugins:maven-surefire-plugin:test -Dmaven.test.skip=true

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

[INFO] Tests are skipped.

说明跳过了测试的执行。

插件传参的2种方式

刚才上面讲了一种通过-D后面跟用户属性的方式给用户传参,还有一种方式,在pom.xml中properties的用户自定义属性中进行配置,如下:

修改项目的pom.xml,在properties中加入<maven.test.skip>true</maven.test.skip>,然后运行:

mvn org.apache.maven.plugins:maven-surefire-plugin:test

会发现跟-Dmaven.test.skip=true效果一样

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 配置maven编译的时候采用的编译器版本 -->
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    <!-- 指定源代码是什么版本的,如果源码和这个版本不符将报错,maven中执行编译的时候会用到这个配置,默认是1.5,这个相当于javac命令后面的-source参数 -->
    <maven.compiler.source>1.8</maven.compiler.source>
    <!-- 该命令用于指定生成的class文件将保证和哪个版本的虚拟机进行兼容,maven中执行编译的时候会用到这个配置,默认是1.5,这个相当于javac命令后面的-target参数 -->
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.test.skip>true</maven.test.skip>
</properties>

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin -Dgoal=compile -Ddetail

获取插件目标详细描述信息的另外一种方式

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

上面这个命令调用的是help插件的describe这个目标,这个目标可以列出其他指定插件目标的详细信息,看效果:

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin -Dgoal=compile -Ddetail运行后,参数说明中多了一行User property: 属性名称,这个属性名称可以通过两种方式传递:

  1. mvn命令-D属性名称的方式传递
  2. pom.xml中properties中定义的方式指定。

现在可以大家估计可以知道我们一直用的-Dmaven.test.skip为什么可以跳过测试代码的编译和单元测试的执行了吧。

插件前缀

运行插件的时候,可以通过指定插件坐标的方式运行,但是插件的坐标信息过于复杂,也不方便写和记忆,所以maven中给插件定义了一些简捷的插件前缀,可以通过插件前缀来运行指定的插件。

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

mvn help:describe -Dplugin=插件goupId:插件artifactId[:插件version]

插件和生命周期阶段绑定

maven只是定义了生命周期中的阶段,而没有定义每个阶段中具体的实现,这些实现是由插件的目标来完成的,所以需要将阶段和插件目标进行绑定,来让插件目标帮助生命周期的阶段做具体的工作,生命周期中的每个阶段支持绑定多个插件的多个目标。

当我们将生命周期中的阶段和插件的目标进行绑定的时候,执行mvn 阶段就可以执行和这些阶段绑定的插件目标

maven内置插件以及绑定

maven为了让我们不用做任何配置就可以实现一些项目的构建操作,比如运行mvn clean就可以帮我们清理代码,运行mvn install就可以将构件安装到本地仓库,所以maven帮我们做了一些事情,maven内部已经提供了很多默认的插件,而将一些阶段默认和这些插件阶段绑定好了,所以我们不用做任何配置就可以执行清理代码、编译代码、测试、打包、安装到本地仓库、上传到远程仓库等阶段的操作,是因为maven已经默认给这些阶段绑定好了插件目标,所以不需要我们再去配置,就直接可以运行,这些都是maven内置绑定帮我们做的事情。

自定义绑定

除了默认绑定的一些操作,我们自己也可以将一些阶段绑定到指定的插件目标上来完成一些操作,这种自定义绑定让maven项目在构件的过程中可以执行更多更丰富的操作。

将源码jar安装到本地仓库

常见的一个案例是:创建项目的源码jar包,将其安装到仓库中,内置插件绑定关系中没有涉及到这一步的任务,所以需要用户自己配置。

插件maven-source-pluginjar-no-fork可以帮助我们完成该任务,我们将这个目标绑定在default生命周期的verify阶段上面,这个阶段没有任何默认绑定,verify是在测试完成之后并将构件安装到本地仓库之前执行的阶段,在这个阶段我们生成源码,pom.xml中配置如下:

    <build>
        <plugins>
            <plugin>
                <!--mvn help:describe -Dplugin=org.apache.maven.plugins:maven-source-plugin -Ddetail -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <!-- 使用插件需要执行的任务 -->
                    <execution>
                        <!-- 任务的id,需唯一,如果不指定,默认为default -->
                        <id>attach-source</id>
                        <!-- 任务中插件的目标,可以指定多个 -->
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                        <!-- 绑定的阶段 -->
                        <phase>verify</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

以上配置的功能是为verify生命周期阶段绑定source:jar-no-fork目标,这样就会在执行verify阶段的时候调用该目标了。

当添加以上配置后再次运行mvn install后会额外生成maven-chat06-1.0-SNAPSHOT-sources.jar源码jar安装到本地仓库。默认情况下是没有的 image.png

mvn clean compile

我们知道3套生命周期的运行时没有依赖的,但是每套中的阶段是有先后顺序的,运行某个阶段的时候,会先执行他前面所有的阶段。清理代码使用的是clean周期中的clean阶段,编译代码用的是default周期中的compile阶段,当直接运行mvn compile编译代码的时候并不会去清理代码,编译代码的时候若发现文件没有变动,会跳过没有变化的文件进行编译。如果我们想每次编译之前强制先清理代码,我们经常这么写:

mvn clean compile

我们也可以利用自定义绑定功能,在default生命周期的第一个阶段validate绑定清理代码的插件。在pom.xml中加入以下配置:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.5</version>
                <executions>
                    <!-- 使用插件需要执行的任务 -->
                    <execution>
                        <!-- 任务中插件的目标,可以指定多个 -->
                        <id>clean-target</id>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                        <!-- 绑定的阶段 -->
                        <phase>validate</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

这个时候执行mvn compile也能在compile阶段前执行代码清理的工作了

pom.xml插件配置

  1. build->plugins->plugin
<!-- 插件参数配置,对插件中所有的目标起效 -->
<configuration>
    <目标参数名>参数值</目标参数名>
</configuration>

configuration节点下配置目标参数的值,节点名称为目标的参数名称,上面这种配置对当前插件的所有目标起效,也就是说这个插件中所有的目标共享此参数配置。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <!-- 插件参数配置,对插件中所有的目标起效 -->
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>
</build>

运行mvn test后看效果。可以看到Test are skipped,说明跳过了测试,到此为止,跳过测试已经讲了3种了:

  1. mvn test -Dmaven.test.skip=tue
  2. properties中配置<maven.test.skip>true</maven.test.skip>
  3. build中配置插件参数的方式,见上
  1. project->build->plugins->plugin->executions->execution
<!-- 这个地方配置只对当前任务有效 -->
<configuration>
    <目标参数名>参数值</目标参数名>
</configuration>

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


<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.4</version>
            <executions>
                <execution>
                    <goals>
                        <goal>test</goal>
                        <goal>help</goal>
                    </goals>
                    <phase>pre-clean</phase>
                    <!-- 这个地方配置只对当前任务有效 -->
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

运行mvn pre-clean后看效果。上面自定义了一个绑定,在clean周期的pre-clean阶段绑定了插件maven-surefire-plugin的两个目标test和helpexecution元素没有指定id,所以默认id是default

查看项目最终pom.xml文件

我们的pom.xml默认会继承maven顶级的一个父类pom.xml,顶级的pom.xml中指定了很多默认的配置,如生命周期中的阶段和很多插件的绑定。

mvn命令在项目中执行的时候,我们的pom.xml和父类的pom.xml最终会进行合并,我们可以通过下面这个命令查看最终pom.xml文件:

mvn help:effective-pom
mvn help:effective-pom > 1.xml

参考:http://www.itsoku.com/course/2/67