maven生命周期和常用插件

Posted by hcy on July 30, 2020

maven生命周期和常用插件

本文讲解下maven的生命周期和常用插件。

maven的生命周期共分为下面三个部分,每个部分由多个步骤组成。

1. 清理部分

步骤 描述
pre-clean 在实际项目清理之前执行所需的过程
clean 删除以前的版本生成的所有文件
post-clean 执行完成项目清理所需的过程

2. 编译部分

步骤 描述
validate 验证项目正确无误,并提供所有必要的信息。
initialize 初始化构建状态,例如设置属性或创建目录。
generate-sources 生成任何要包含在编译中的源代码。
process-sources 处理源代码,例如过滤任何值。
generate-resources 生成资源以包含在包中。
process-resources 将资源复制并处理到目标目录中,以备打包。
compile 编译项目的源代码。
process-classes 对编译后生成的文件进行后处理,例如对Java类进行字节码增强。
generate-test-sources 生成任何测试源代码以包含在编译中。
process-test-sources 处理测试源代码,例如过滤所有值。
generate-test-resources 创建测试资源。
process-test-resources 将资源复制并处理到测试目标目录中。
test-compile 将测试源代码编译到测试目标目录中
process-test-classes 从测试编译中对生成的文件进行后处理,例如对Java类进行字节码增强。
test 使用合适的单元测试框架运行测试。这些测试不应要求将代码打包或部署。
prepare-package 在实际包装之前执行准备包装所需的任何操作。这通常会导致包装的未包装,已处理版本。
package 获取编译后的代码,并将其打包为可分发格式,例如JAR。
pre-integration-test 在执行集成测试之前执行所需的操作。这可能涉及诸如设置所需环境的事情。
integration-test 处理该程序包,并在必要时将其部署到可以运行集成测试的环境中。
post-integration-test 在执行集成测试后执行所需的操作。这可能包括清理环境。
verify 运行任何检查以确认包装有效并符合质量标准。
install 将软件包安装到本地存储库中,以作为本地其他项目中的依赖项。
deploy 在集成或发布环境中完成后,将最终程序包复制到远程存储库,以便与其他开发人员和项目共享。

3. 站点部分

步骤 描述
pre-site 在实际项目站点生成之前执行所需的过程
site 生成项目的站点文档
post-site 执行完成网站生成并为网站部署做准备所需的过程
site-deploy 将生成的站点文档部署到指定的Web服务器

生命周期调用逻辑

​ 我们看到生命周期一共分为三个部分,每个部分有多个步骤组成。调用每个步骤时,会先调用其上面的步骤。

例如:

我们调用post-clean步骤时,会先调用pre-cleanclean 才会调用post-clean

​ 但是不同部分的步骤不会影响。如果我们调用编译部分的process-sources步骤,在执行此步骤前会调用

validate initialize generate-sources,但是并不会执行清理部分里面的步骤。

步骤调用方式

​ 调用maven的步骤很简单就像下面这样

mvn clean   调用清理周期内的clean步骤,!!注意这里同时也会调用clean上面的pre-clean步骤。


mvn package   调用编译部分的从validate到package(含)之间的所有步骤。

插件的绑定

​ 我们通常执行下面命令来清理并打包项目。这个命令就执行了清理周期里面的pre-cleanclean,以及打包周期里面的从validatepackage 之间的所有步骤。

1
mvn clean package

​ maven真正的执行都是由插件完成的,插件只需要将自己绑定到maven的步骤上,当maven执行到相应步骤时就会调用插件里面的方法。插件是由Java编写的,也就是会回调插件的某个指定方法。

​ 如果某个步骤上没有被插件绑定,那么执行这个步骤时不会有任何效果。并不是每个步骤上都被插件绑定的。

默认的绑定行为

​ 默认我们什么也不做,maven就已经自带一些插件并绑定在周期的步骤上,当执行到该步骤时会自动调用插件的指定方法。

​ 如清理周期内的maven-clean-plugin绑定在clean步骤上,maven-resources-plugin插件将多个方法绑定在多个步骤上,分别实现复制资源和复制test资源,maven-jar-plugin插件可以将编译完成的文件打包成jar包。

默认清理周期内的绑定

Phase plugin:goal
clean clean:clean

默认编译周期内的绑定 ejb / ejb3 / jar / par / rar / war

Phase plugin:goal
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war
install install:install
deploy deploy:deploy

默认站点周期内的绑定

Phase plugin:goal
site site:site
site-deploy site:deploy

手动绑定插件到周期上

​ 有时这些默认的插件无法满足我们的需求,我么需要配置一些插件到周期上,下面以maven-assembly-plugin插件为例,验证插件的绑定。

​ 首先pom.xml文件里添加该插件,注意看execution里面已经将插件的single绑定到package步骤上,

因为一个插件可以绑定多个步骤,所以外面才会有一个executions标签。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>

        <executions>
            <execution>
                <id>assembly_build</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>

    </plugin>

下面执行:

1
mvn clean package

​ 可以看到jar-plugin 下面执行了assembly-pluginsingle方法。生成的文件里出现一个包含第三方依赖的jar包,这正是assembly 插件的作用之一,将第三方依赖打包进jar包里。

image-20200730205526670

image-20200730205649969

常用插件

maven-checkstyle-plugin 代码格式检查

maven-dependency-plugin 依赖相关的功能,如检查依赖,复制出依赖,等等

maven-assembly-plugin 将一些文档、第三方依赖、等等打包到一个包里面。

maven-shade-pluginassembly类似,也可以将第三方依赖打包成一个jar文件,而且可以分析第三方依赖里那些类是没有使用到的,排除掉他们使打包的体积更小。

注意事项

通常我们不会主动调用使用连字符的步骤如pre-* , post-*process-*

参考

maven官网生命周期部分

maven官网插件部分

maven官网插件开发部分

maven官网入门指南


转载请注明出处:https://www.huangchaoyu.com/2020/07/30/maven生命周期和常用插件/