Maven系列第6篇:生命周期和插件详解?高手必备!,你们觉得作为一名程序员最大的悲哀是什么

[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先清理编译的代码,然后执行了default生命周期的compile阶段,将项目打成了jar放在了target目录,如下图:

640?wx_fmt=png

大家看到上面还有很多其他的输出,这个大家可以先忽略,本文看完了,都会明白的。

mvn clean install效果

D:\code\IdeaProjects\maven-chat06>mvn clean install

[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] — maven-install-plugin:2.4:install (default-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的输出对比一下,多了几行输出,主要是多了2个Installing...,将项目打成jar包以及项目的pom文件放到本地仓库去了,也就是将构件打包安装到本地仓库了。

上面几个mvn命令的案例,都是通过mvn命令去执行了mvn中定义的生命周期中的阶段,然后完成了很多看似内部很复杂的操作。比如打包,内部包含很多复杂的操作,maven都帮我们屏蔽了,通过一个简单的mvn package就完成了。

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

我们在回头看一下上面一个输出中,有很多类似于maven-xxxx-plugin:版本:xxx这样的内容,这个就是表示当前在运行这个插件来完成对应阶段的操作,mvn 阶段明明执行的是阶段,但是实际输出中确实插件在干活,那么阶段是如何和插件关联起来的呢?插件又是什么呢?

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

Maven插件

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

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=

to display parameter details.

上面列出了maven-clean-plugin这个插件所有的目标,有2个,分别是clean:clean、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=

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}这样的部分,这种表示给这个运行的目标传参,可以通过mvn -Dxxx这种方式传参,xxx${xxx}中的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=

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中运行测试用例使用到的插件坐标是:

org.apache.maven.plugins

maven-surefire-plugin

2.12.4

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

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

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

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

D:\code\IdeaProjects\maven-chat06>mvn org.apache.maven.plugins:maven-surefire-plugin: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] ------------------------------------------------------------------------

[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=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:test (default-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>true</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 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.638 s

[INFO] Finished at: 2019-11-18T15:46:04+08:00

[INFO] ------------------------------------------------------------------------

输出中也有Tests are skipped.,说明也跳过了测试,和-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.

可以拿这种和上面获取插件目标参数详情列表对比一下,上面这个更详细一些,参数说明中多了一行User property: 属性名称,这个属性名称可以通过两种方式传递:

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

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

现在可以大家估计可以知道我们一直用的-Dmaven.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] ------------------------------------------------------------------------

上面通过别名来运行插件maven-surefire-plugintest目标,是不是简洁了很多。

上面用了很多mvn help:这个命令,这个调用的是maven-help-plugin插件的功能,help是插件的前缀,它的坐标是:

org.apache.maven.plugins

maven-help-plugin

3.2.0

插件和生命周期阶段绑定

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

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

maven内置插件以及绑定

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

maven内置绑定
clean生命周期阶段与插件绑定关系

| 生命周期阶段 | 插件:目标 |

| — | — |

| pre-clean |

|

| clean | maven-clean-plugin:clean |

| post-clean |

|

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

运行一下看一下效果:

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 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] 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] 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 (default-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-pluginjar-no-fork可以帮助我们完成该任务,我们将这个目标绑定在default生命周期的verify阶段上面,这个阶段没有任何默认绑定,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如下:

<?xml version="1.0" encoding="UTF-8"?>

<project 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

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

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 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]

[INFO] — maven-jar-plugin:2.4:jar (default-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 (default-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 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: ‘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 for attaching to the build lifecycle.

Implementation: org.apache.maven.plugins.source.SourceJarNoForkMojo

Language: java

Bound to phase: package

上面输出中有个Bound to phase: package,表示默认绑定在了package阶段上。

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

mvn clean compile

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

D:\code\IdeaProjects\maven-chat06>mvn clean compile

[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] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time:  1.666 s

[INFO] Finished at: 2019-11-18T17:16:53+08:00

[INFO] ------------------------------------------------------------------------

还有其他方式么?

我们刚才学了自定义绑定,我们可以在default生命周期的第一个阶段validate绑定清理代码的插件,那我们来通过自定义绑定来实现一下,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 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 (clean-target) @ 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] 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

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

image

image

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

t: 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

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-5a7eBfrn-1712200649397)]
[外链图片转存中…(img-D9TkPw6E-1712200649398)]
[外链图片转存中…(img-rzEx4k3l-1712200649398)]
[外链图片转存中…(img-2VrMrYUR-1712200649398)]
[外链图片转存中…(img-vmMbjBEi-1712200649399)]
[外链图片转存中…(img-uUuHMXKj-1712200649399)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-T7FEwHN9-1712200649399)]

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

[外链图片转存中…(img-uBNYLuX8-1712200649399)]

[外链图片转存中…(img-dfP7o70q-1712200649400)]

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值