maven生命周期和常用插件
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-clean
,clean
才会调用post-clean
。
但是不同部分的步骤不会影响。如果我们调用编译部分的process-sources
步骤,在执行此步骤前会调用
validate
initialize
generate-sources
,但是并不会执行清理部分里面的步骤。
步骤调用方式
调用maven的步骤很简单就像下面这样
1 |
|
插件的绑定
我们通常执行下面命令来清理并打包项目。这个命令就执行了清理周期里面的pre-clean
,clean
,以及打包周期里面的从validate
到 package
之间的所有步骤。
1 |
|
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 |
|
下面执行:
1 |
|
可以看到jar-plugin
下面执行了assembly-plugin
的single
方法。生成的文件里出现一个包含第三方依赖的jar包,这正是assembly
插件的作用之一,将第三方依赖打包进jar包里。
常用插件
maven-checkstyle-plugin
代码格式检查
maven-dependency-plugin
依赖相关的功能,如检查依赖,复制出依赖,等等
maven-assembly-plugin
将一些文档、第三方依赖、等等打包到一个包里面。
maven-shade-plugin
和assembly
类似,也可以将第三方依赖打包成一个jar文件,而且可以分析第三方依赖里那些类是没有使用到的,排除掉他们使打包的体积更小。
注意事项
通常我们不会主动调用使用连字符的步骤如pre-*
, post-*
,process-*
参考